void listenForClients() { listener_ = openListener(port_); maximumClientDescriptor_ = listener_; FD_SET(listener_, &clientsSet_); while(true) { temporarySet_ = clientsSet_; select(maximumClientDescriptor_+1, &temporarySet_, NULL, NULL, NULL); if(FD_ISSET(listener_, &temporarySet_)) { std::cout << "New client connection..." << std::endl; struct sockaddr_in addr; socklen_t len = sizeof(addr); SSL *ssl; int client = accept(listener_, (struct sockaddr*)&addr, &len); ssl = SSL_new(serverContext_); SSL_set_fd(ssl, client); if ( SSL_accept(ssl) == FAIL ) { ERR_print_errors_fp(stderr); } ClientDesc desc; desc.descriptor = client; desc.ssl = ssl; std::cout << "Connected client real name: " << getClientCN(ssl) << std::endl; desc.canBroadcast = isNameOnBroadcastList(getClientCN(ssl)); clientDescriptors_[client] = desc; FD_SET(client, &clientsSet_); if(client > maximumClientDescriptor_) maximumClientDescriptor_ = client; } for (auto client : clientDescriptors_) { temporarySet_ = clientsSet_; select(maximumClientDescriptor_+1, &temporarySet_, NULL, NULL, NULL); if(FD_ISSET(client.second.descriptor, &temporarySet_)) { serveClient(client.second); } } } }
MainWindow::MainWindow( QWidget * parent ) : QMainWindow( parent ) // создали QT-шное окно в конструкторе родителя { // создание группы для отрисовки QGroupBox* drawPanelBox = new QGroupBox( tr("Draw Panel") ); QVBoxLayout* panelLayout = new QVBoxLayout( drawPanelBox ); drawPanel = new DrawPanel( DrawPanel::DEFAULT_WIDTH, DrawPanel::DEFAULT_HEIGHT, drawPanelBox ); panelLayout->addWidget( drawPanel ); // создание группы для контролов QGroupBox* controllers = new QGroupBox( tr("Controllers") ); QVBoxLayout* cLayout = new QVBoxLayout( controllers ); SizeController* xC = new SizeController( this, "Position X", -SizeController::DEFAULT_MAX_VALUE, SizeController::DEFAULT_MAX_VALUE, Circle::DEFAULT_CENTER_X); SizeController* yC = new SizeController( this, "Position Y", -SizeController::DEFAULT_MAX_VALUE, SizeController::DEFAULT_MAX_VALUE, Circle::DEFAULT_CENTER_Y); SizeController* rC = new SizeController( this, "Radius", 0, SizeController::DEFAULT_MAX_VALUE, Circle::DEFAULT_RADIUS); cLayout->addWidget( xC ); cLayout->addWidget( yC ); cLayout->addWidget( rC ); // фиксируем растяжение по горизонтали контролов controllers->setSizePolicy( QSizePolicy::Fixed, QSizePolicy::Expanding ); // создаём виджет контейнер, который вложим в наш главный виджет QMainWindow QWidget * container = new QWidget; // располагаем вертикально область для рисования и контролов //и помещаем в контейнер QHBoxLayout * mainLayout = new QHBoxLayout( container ); mainLayout->addWidget( drawPanelBox ); mainLayout->addWidget( controllers ); // устанавливаем начинку главному виджету setCentralWidget(container); // изменили значения контролов, нужно вызвать отрисовку и установить новые значения параметров QObject::connect( xC, SIGNAL( valueChanged(int) ), drawPanel->getCircle(), SLOT( setX(int) )); QObject::connect( yC, SIGNAL( valueChanged(int) ), drawPanel->getCircle(), SLOT( setY(int) )); QObject::connect( rC, SIGNAL( valueChanged(int) ), drawPanel->getCircle(), SLOT( setR(int) )); // для обратной связи при считывании из файла настроек, чтобы бегунки настроить QObject::connect(drawPanel->getCircle(), SIGNAL(changeX(int)), xC, SLOT(setValue(int))); QObject::connect(drawPanel->getCircle(), SIGNAL(changeY(int)), yC, SLOT(setValue(int))); QObject::connect(drawPanel->getCircle(), SIGNAL(changeR(int)), rC, SLOT(setValue(int))); /*По идее архитектура должна быть построена так: Вызывается сигнал, мы у области рисования вызываем слот перерисовки. В области рисования у нас есть разные объекты для отрисовки. В перерисовки мы независимо у каждого вызываем функцию перерисовки. Картинка отрисовывается как сумма отображений каждого объекта Остальные контролы сразу меняют своё состояние, не дожидаясь отрисовки, потому что отрисовка может занимать значительное время, а параметры должны быть действительными на данный момент */ // Создание меню и привязываем действия QMenuBar *menuBar = new QMenuBar( this ); QMenu* menu = new QMenu(tr("File"), menuBar); QAction* openAction = menu->addAction( tr("Open") ); QAction* saveAction = menu->addAction( tr("Save") ); QObject::connect( openAction, SIGNAL( triggered() ), this, SLOT( openListener() )); QObject::connect( saveAction, SIGNAL( triggered() ), this, SLOT( saveListener() )); menuBar->addMenu( menu ); // добавляем меню и заголовок изменяем setMenuBar( menuBar ); setWindowTitle( tr("Circle") ); }