void tst_QDockWidget::setTitleBarWidget() { //test the successive usage of setTitleBarWidget QDockWidget dock; QWidget w, w2; dock.show(); qApp->processEvents(); dock.setTitleBarWidget(&w); qApp->processEvents(); QCOMPARE(w.isVisible(), true); //set another widget as the titlebar widget dock.setTitleBarWidget(&w2); // this used to crash (task 184668) qApp->processEvents(); QCOMPARE(w.isVisible(), false); QCOMPARE(w2.isVisible(), true); //tries to reset the titlebarwidget to none dock.setTitleBarWidget(0); qApp->processEvents(); QCOMPARE(w.isVisible(), false); QCOMPARE(w2.isVisible(), false); }
void Style::dockLocationChanged( Qt::DockWidgetArea /*area*/ ) { QDockWidget *dock = carriedDock ? carriedDock : qobject_cast<QDockWidget*>( sender() ); if ( !dock ) return; if ( dock->isFloating() || !Hacks::config.lockDocks ) { if ( QWidget *title = dock->titleBarWidget() ) { if ( title->objectName() == "bespin_docktitle_dummy" ) { dock->setTitleBarWidget(0); title->deleteLater(); } else title->show(); } } else { QWidget *title = dock->titleBarWidget(); if ( !title ) { title = new QWidget; title->setObjectName( "bespin_docktitle_dummy" ); dock->setTitleBarWidget( title ); } if ( title->objectName() == "bespin_docktitle_dummy" ) dock->titleBarWidget()->hide(); } }
void HideTitleBars::slotShowTitleBars(bool show) { QList <QDockWidget *> docks = pCore->window()->findChildren<QDockWidget *>(); for (int i = 0; i < docks.count(); ++i) { QDockWidget* dock = docks.at(i); QWidget *bar = dock->titleBarWidget(); if (show) { if (dock->isFloating()) { if (bar) { dock->setTitleBarWidget(0); delete bar; } continue; } #if (QT_VERSION >= QT_VERSION_CHECK(5, 6, 0)) // Since Qt 5.6 we only display title bar in non tabbed dockwidgets QList <QDockWidget*> docked = pCore->window()->tabifiedDockWidgets(dock); if (docked.isEmpty()) { if (bar) { dock->setTitleBarWidget(0); delete bar; } continue; } else { bool hasVisibleDockSibling = false; foreach(QDockWidget *sub, docked) { if (sub->toggleViewAction()->isChecked()) { // we have another docked widget, so tabs are visible and can be used instead of title bars hasVisibleDockSibling = true; break; } } if (!hasVisibleDockSibling) { if (bar) { dock->setTitleBarWidget(0); delete bar; } continue; } } if (!bar) { dock->setTitleBarWidget(new QWidget); } #else if (bar) { dock->setTitleBarWidget(0); delete bar; } #endif } else { if (!dock->isFloating() && !bar) { dock->setTitleBarWidget(new QWidget); } } }
QDockWidget* MainWindow::newDockWidgetFor(QWidget *w) { QDockWidget *dock = new QDockWidget(this); dock->setAllowedAreas(Qt::TopDockWidgetArea); dock->setWidget(w); dock->setFeatures(QDockWidget::NoDockWidgetFeatures); dock->setTitleBarWidget(new QWidget(this)); addDockWidget(Qt::TopDockWidgetArea, dock); return dock; }
/****************************************************************************** * Creates a dock panel. ******************************************************************************/ void MainWindow::createDockPanel(const QString& caption, const QString& objectName, Qt::DockWidgetArea dockArea, Qt::DockWidgetAreas allowedAreas, QWidget* contents) { QDockWidget* dockWidget = new QDockWidget(caption, this); dockWidget->setObjectName(objectName); dockWidget->setAllowedAreas(allowedAreas); dockWidget->setFeatures(QDockWidget::DockWidgetClosable); dockWidget->setWidget(contents); dockWidget->setTitleBarWidget(new QWidget()); addDockWidget(dockArea, dockWidget); }
MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) , ui(new Ui::MainWindow) { ui->setupUi(this); QDockWidget *testDock = new QDockWidget(tr("Test Dock")); testDock->setFeatures(QDockWidget::DockWidgetClosable | QDockWidget::DockWidgetFloatable | QDockWidget::DockWidgetMovable); testDock->setMinimumWidth(200); testDock->setStyleSheet(tr("background-color:green;")); MyDockTitleBar *titlebar1 = new MyDockTitleBar(testDock); testDock->setTitleBarWidget(titlebar1); QWidget *testWidget = new QWidget; QVBoxLayout *box = new QVBoxLayout; QPushButton *okButton = new QPushButton(tr("Ok")); okButton->setStyleSheet(tr("background-color:white;")); box->addWidget(okButton); testWidget->setLayout(box); testDock->setWidget(testWidget); ////////////////////////////////////////////////////////// QDockWidget *testDock2 = new QDockWidget(tr("Test Dock2")); testDock2->setFeatures(QDockWidget::DockWidgetClosable | QDockWidget::DockWidgetFloatable | QDockWidget::DockWidgetMovable); testDock2->setMinimumWidth(200); testDock2->setStyleSheet(tr("background-color:orange;")); MyDockTitleBar *titlebar2 = new MyDockTitleBar(testDock2); testDock2->setTitleBarWidget(titlebar2); QWidget *testWidget2 = new QWidget; QVBoxLayout *box2 = new QVBoxLayout; QPushButton *okButton2 = new QPushButton(tr("Ok")); okButton2->setStyleSheet(tr("background-color:white;")); box2->addWidget(okButton2); testWidget2->setLayout(box2); testDock2->setWidget(testWidget2); ////////////////////////////////////////////////////////// this->addDockWidget(Qt::LeftDockWidgetArea, testDock); this->setTabPosition(Qt::LeftDockWidgetArea, QTabWidget::West); this->tabifyDockWidget(testDock, testDock2); }
/** Returns the pointer to the dock widget for the given dock area. If dockwidget corresponding to the dock area is not found, new dockwidget for that dock area is created. \param area DockWidgetArea for which corresponding dockwidget is returned. */ QDockWidget* GCF::Components::MainWindow::dockWidget(Qt::DockWidgetArea area) { QDockWidget* ret = 0; if(d->dockWidgetMap.contains(area)) ret = d->dockWidgetMap[area]; if(!ret) { // create the dock widget ret = new QDockWidget(this); ret->setAllowedAreas(area); ret->setFeatures(QDockWidget::NoDockWidgetFeatures); // This is to remove the title bar QWidget* titleWidget = new QWidget(this); ret->setTitleBarWidget( titleWidget ); // place a tab widget on the dock widget QTabWidget* tabWidget = new QTabWidget(ret); ret->setWidget(tabWidget); // position the tabs in the right place. switch(area) { case Qt::LeftDockWidgetArea: tabWidget->setTabPosition(QTabWidget::North); break; case Qt::RightDockWidgetArea: tabWidget->setTabPosition(QTabWidget::North); break; case Qt::TopDockWidgetArea: tabWidget->setTabPosition(QTabWidget::North); // tabWidget->setFixedHeight(150); // ret->setFixedHeight(150); break; case Qt::BottomDockWidgetArea: tabWidget->setTabPosition(QTabWidget::North); // tabWidget->setFixedHeight(150); // ret->setFixedHeight(150); break; default: break; } } addDockWidget(area, ret); d->dockWidgetMap[area] = ret; ret->hide(); return ret; }
void MainWindow::createHeader() { // QToolBar *tb = new QToolBar(this); QDockWidget *header = new QDockWidget(this); QHBoxLayout *ly = new QHBoxLayout(); QFrame *frm = new QFrame(); QPushButton *pbExit = new QPushButton(); pbExit->setIcon(QIcon(":/images/meiti-up.png")); pbExit->setIconSize(QSize(40,40)); pbExit->setFocusPolicy(Qt::NoFocus); pbExit->setFocusProxy(0); pbExit->setStyleSheet(QString("background-image: url(:/images/meiti-up.png);\n\n#pbExit:pressed {background-image: url(:/images/meiti-down.png) 4 4 4 4 strech strech;}\n\n#pbExit:hover {background-image: url(:/images/meiti-over.png) 4 4 4 4 strech strech;}\n")); connect(pbExit, SIGNAL(clicked()), qApp, SLOT(quit())); ly->addWidget(pbExit); ly->setAlignment(pbExit,Qt::AlignCenter); frm->setLayout(ly); frm->setAttribute(Qt::WA_TranslucentBackground, true); // 设置背景透明(version >= QT4.5 header->setWidget(frm); header->setAttribute(Qt::WA_TranslucentBackground, true); // 设置背景透明(version >= QT4.5 //header->setWindowFlags(Qt::FramelessWindowHint); header->setWindowTitle(QString("")); header->setTitleBarWidget(new QWidget); header->setFocusPolicy(Qt::NoFocus); header->setFocusProxy(0); header->setFeatures(QDockWidget::NoDockWidgetFeatures); header->setBaseSize(0,40); addDockWidget(Qt::TopDockWidgetArea,header, Qt::Horizontal); // tb->addWidget(frm); // pbExit->setText(QString("%1--%2--%3").arg(this->width()).arg(tb->width()).arg(pbExit->width())); // // tb->setMovable(false); // // this->addToolBar(tb); // dockWidget->setWidget(keyboardfrm); // dockWidget->setAllowedAreas(Qt::BottomDockWidgetArea); // dockWidget->setFeatures(QDockWidget::DockWidgetClosable); // addDockWidget(Qt::BottomDockWidgetArea,dockWidget); }
void MainWindow::createDatabaseExplorer() { ExplorerWidget *explorer = new ExplorerWidget(this); AppRegistry::instance().bus()->subscribe(explorer, ConnectingEvent::Type); AppRegistry::instance().bus()->subscribe(explorer, ConnectionFailedEvent::Type); AppRegistry::instance().bus()->subscribe(explorer, ConnectionEstablishedEvent::Type); QDockWidget *explorerDock = new QDockWidget(tr("Database Explorer")); explorerDock->setAllowedAreas(Qt::LeftDockWidgetArea | Qt::RightDockWidgetArea); explorerDock->setWidget(explorer); explorerDock->setFeatures(QDockWidget::DockWidgetClosable | QDockWidget::DockWidgetMovable); QWidget *titleWidget = new QWidget(this); // this lines simply remove explorerDock->setTitleBarWidget(titleWidget); // title bar widget. QAction *actionExp = explorerDock->toggleViewAction(); // Adjust any parameter you want. actionExp->setText(QString("&Explorer")); actionExp->setShortcut(QKeySequence(Qt::CTRL + Qt::Key_E)); actionExp->setStatusTip(QString("Press to show/hide Database Explorer panel.")); actionExp->setChecked(true); // Install action in the menu. _viewMenu->addAction(actionExp); addDockWidget(Qt::LeftDockWidgetArea, explorerDock); LogWidget *log = new LogWidget(this); VERIFY(connect(&Logger::instance(), SIGNAL(printed(const QString&, mongo::LogLevel)), log, SLOT(addMessage(const QString&, mongo::LogLevel)))); _logDock = new QDockWidget(tr("Logs")); QAction *action = _logDock->toggleViewAction(); // Adjust any parameter you want. action->setText(QString("&Logs")); action->setShortcut(QKeySequence(Qt::CTRL + Qt::Key_L)); //action->setStatusTip(QString("Press to show/hide Logs panel.")); //commented for now because this message hides Logs button in status bar :) action->setChecked(false); // Install action in the menu. _viewMenu->addAction(action); _logDock->setAllowedAreas(Qt::LeftDockWidgetArea | Qt::RightDockWidgetArea | Qt::BottomDockWidgetArea | Qt::TopDockWidgetArea); _logDock->setWidget(log); _logDock->setFeatures(QDockWidget::DockWidgetClosable | QDockWidget::DockWidgetMovable); _logDock->setVisible(false); addDockWidget(Qt::BottomDockWidgetArea, _logDock); }
WindowImpl::WindowImpl(): m_ui(new Ui::WindowImpl) { m_ui->setupUi(this); QApplication::setStyle(new QNotoStyle); QSettings sets(QSettings::IniFormat, QSettings::UserScope, "qnoto", "qnoto"); restoreGeometry(sets.value("MainWindow/Geometry").toByteArray()); QDockWidget *dockWidget = new QDockWidget("Left side", this); dockWidget->setContentsMargins(0, 0, 0, 0); dockWidget->setAllowedAreas(Qt::LeftDockWidgetArea); dockWidget->setFloating(false); dockWidget->setFeatures(dockWidget->features() ^ QDockWidget::DockWidgetClosable ^ QDockWidget::DockWidgetMovable ^ QDockWidget::DockWidgetFloatable); dockWidget->setTitleBarWidget(new QWidget); m_split = new SideSplit(this); dockWidget->setWidget(m_split); addDockWidget(Qt::LeftDockWidgetArea, dockWidget); m_editors = qnoto::plugin<qnoto::Editors>(); connect(m_editors, &qnoto::Editors::updateEditMenu, this, &WindowImpl::updateEditMenu); setCentralWidget(m_editors); const auto& acts = m_editors->actions(); for(const auto& it: acts){ if (it->property("name").toString().startsWith("File_")){ m_ui->menuFile->addAction(it); } if (it->property("name").toString().startsWith("Window_")){ m_ui->menuWindow->addAction(it); } } connect(m_ui->actionPreferences, &QAction::triggered, this, &WindowImpl::showPreferences); m_split->restoreState(sets); m_editors->restoreState(); }
void QDockWidgetProto::setTitleBarWidget ( QWidget * widget ) { QDockWidget *item = qscriptvalue_cast<QDockWidget*>(thisObject()); if (item) item->setTitleBarWidget(widget); }
MainWindow::MainWindow(QWidget* parent) : QMainWindow(parent) { const int screenWidth = QApplication::desktop()->width(); const int screenHeight = QApplication::desktop()->height(); const int appWidth = 500; const int appHeight = 300; setGeometry((screenWidth - appWidth) / 2, (screenHeight - appHeight) / 2, appWidth, appHeight); setObjectName("mainwindow"); setWindowTitle("developers' test version, not for public use"); setWindowIcon(QIcon(":/icons/icon64.png")); setContextMenuPolicy(Qt::PreventContextMenu); QDockWidget* friendDock = new QDockWidget(this); friendDock->setObjectName("FriendDock"); friendDock->setFeatures(QDockWidget::NoDockWidgetFeatures); friendDock->setTitleBarWidget(new QWidget(friendDock)); friendDock->setContextMenuPolicy(Qt::PreventContextMenu); addDockWidget(Qt::LeftDockWidgetArea, friendDock); QWidget* friendDockWidget = new QWidget(friendDock); QVBoxLayout* layout = new QVBoxLayout(friendDockWidget); layout->setMargin(0); layout->setSpacing(0); friendDock->setWidget(friendDockWidget); ourUserItem = new OurUserItemWidget(this); friendsWidget = new FriendsWidget(friendDockWidget); // Create toolbar QToolBar *toolBar = new QToolBar(this); toolBar->setToolButtonStyle(Qt::ToolButtonIconOnly); toolBar->setIconSize(QSize(16, 16)); toolBar->setFocusPolicy(Qt::ClickFocus); QToolButton *addFriendButton = new QToolButton(toolBar); addFriendButton->setIcon(QIcon("://icons/user_add.png")); addFriendButton->setToolTip(tr("Add friend")); connect(addFriendButton, &QToolButton::clicked, friendsWidget, &FriendsWidget::onAddFriendButtonClicked); QWidget *spacer = new QWidget(toolBar); spacer->setSizePolicy(QSizePolicy::Expanding,QSizePolicy::Preferred); QToolButton *menuButton = new QToolButton(toolBar); menuButton->setIcon(QIcon("://icons/cog.png")); menuButton->setToolTip(tr("Mainmenu")); menuButton->setPopupMode(QToolButton::InstantPopup); QMenu *mainmenu = new QMenu(menuButton); mainmenu->addAction(QIcon(":/icons/setting_tools.png"), tr("Settings"), this, SLOT(onSettingsActionTriggered())); mainmenu->addSeparator(); mainmenu->addAction(tr("About %1").arg(AppInfo::name), this, SLOT(onAboutAppActionTriggered())); mainmenu->addAction(tr("About Qt"), qApp, SLOT(aboutQt())); mainmenu->addSeparator(); mainmenu->addAction(tr("Quit"), this, SLOT(onQuitApplicationTriggered()), QKeySequence::Quit); menuButton->setMenu(mainmenu); toolBar->addWidget(addFriendButton); toolBar->addWidget(spacer); toolBar->addWidget(menuButton); // Create toolbar end layout->addWidget(ourUserItem); layout->addWidget(friendsWidget); layout->addWidget(toolBar); PagesWidget* pages = new PagesWidget(this); connect(friendsWidget, &FriendsWidget::friendAdded, pages, &PagesWidget::addPage); connect(friendsWidget, &FriendsWidget::friendSelectionChanged, pages, &PagesWidget::activatePage); connect(friendsWidget, &FriendsWidget::friendStatusChanged, pages, &PagesWidget::statusChanged); //FIXME: start core in a separate function //all connections to `core` should be done after its creation because it registers some types core = new Core(); coreThread = new QThread(this); core->moveToThread(coreThread); connect(coreThread, &QThread::started, core, &Core::start); qRegisterMetaType<Status>("Status"); connect(core, &Core::connected, this, &MainWindow::onConnected); connect(core, &Core::disconnected, this, &MainWindow::onDisconnected); connect(core, &Core::friendRequestRecieved, this, &MainWindow::onFriendRequestRecieved); connect(core, SIGNAL(friendStatusChanged(int, Status)), friendsWidget, SLOT(setStatus(int, Status))); connect(core, &Core::friendAddressGenerated, ourUserItem, &OurUserItemWidget::setFriendAddress); connect(core, &Core::friendAdded, friendsWidget, &FriendsWidget::addFriend); connect(core, &Core::friendMessageRecieved, pages, &PagesWidget::messageReceived); connect(core, &Core::actionReceived, pages, &PagesWidget::actionReceived); connect(core, &Core::friendUsernameChanged, friendsWidget, &FriendsWidget::setUsername); connect(core, &Core::friendUsernameChanged, pages, &PagesWidget::usernameChanged); connect(core, &Core::friendRemoved, friendsWidget, &FriendsWidget::removeFriend); connect(core, &Core::friendRemoved, pages, &PagesWidget::removePage); connect(core, &Core::failedToRemoveFriend, this, &MainWindow::onFailedToRemoveFriend); connect(core, &Core::failedToAddFriend, this, &MainWindow::onFailedToAddFriend); connect(core, &Core::messageSentResult, pages, &PagesWidget::messageSentResult); connect(core, &Core::actionSentResult, pages, &PagesWidget::actionResult); coreThread->start(/*QThread::IdlePriority*/); connect(this, &MainWindow::friendRequestAccepted, core, &Core::acceptFriendRequest); connect(ourUserItem, &OurUserItemWidget::usernameChanged, core, &Core::setUsername); connect(core, &Core::usernameSet, ourUserItem, &OurUserItemWidget::setUsername); connect(ourUserItem, &OurUserItemWidget::statusMessageChanged, core, &Core::setStatusMessage); connect(core, &Core::statusMessageSet, ourUserItem, &OurUserItemWidget::setStatusMessage); connect(ourUserItem, &OurUserItemWidget::statusSelected, core, &Core::setStatus); connect(pages, &PagesWidget::sendMessage, core, &Core::sendMessage); connect(pages, &PagesWidget::sendAction, core, &Core::sendAction); connect(friendsWidget, &FriendsWidget::friendRequested, core, &Core::requestFriendship); connect(friendsWidget, &FriendsWidget::friendRemoved, core, &Core::removeFriend); setCentralWidget(pages); Settings::getInstance().loadWindow(this); }
QxFileBrowser::QxFileBrowser(QWidget* parent) : QWidget(parent), gotoMenu_(0), recentMenu_(0), showHidden_(false), showDetails_(true), createFileDialog_(0), createDirDialog_(0), renameDialog_(0) { //-------------------------------------------------------------------------- // setup primary model and view cwdModel_ = new QFileSystemModel(this); cwdModel_->setReadOnly(false); QModelIndex root = cwdModel_->setRootPath(QDir::currentPath()); connect( cwdModel_, SIGNAL(fileRenamed(const QString&, const QString&, const QString&)), this, SLOT(fileRenamed(const QString&, const QString&, const QString&)) ); dirView_ = new QxFileSystemView(this); dirView_->setModel(cwdModel_); dirView_->header()->hide(); dirView_->setRootIndex(root); dirView_->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); dirView_->setDragDropMode(QAbstractItemView::DragOnly); connect(dirView_, SIGNAL(activated(const QModelIndex&)), this, SLOT(cwdSet(const QModelIndex&))); connect(dirView_, SIGNAL(escape()), this, SIGNAL(escape())); connect(dirView_, SIGNAL(cdUp()), this, SLOT(cdUp())); connect(cwdModel_, SIGNAL(layoutChanged()), dirView_, SLOT(resizeColumnsToContents())); setFocusProxy(dirView_); // dirView_->setTextElideMode(Qt::ElideMiddle); dirView_->setFrameStyle(QFrame::NoFrame); // dirView_->setIndentation(18); // together with a branch pixmap could improve branch alignment dirView_->setLineWidth(0); dirView_->setMidLineWidth(0); #ifdef Q_WS_MAC dirView_->setStyleSheet( "QTreeView {" " font-size: 12px;" "}" "QTreeView::item {" " padding-top: 1px;" "}" ); #endif { QPalette pal = dirView_->palette(); pal.setColor(QPalette::Base, styleManager()->color("fileBrowserDirViewBgColor")); dirView_->setPalette(pal); } //-------------------------------------------------------------------------- // setup navigation bar / panel head gotoButton_ = new QxControl(this, new QxVisual(styleManager()->style("fileBrowserGotoButton"))); gotoButton_->setMode(QxControl::MenuMode); gotoButton_->visual()->setText(QDir::current().dirName()); gotoButton_->setMinimumWidth(10); // design HACK gotoButton_->setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Preferred); { QPixmap folderIcon = QFileIconProvider().icon(QFileInfo(QDir::currentPath())).pixmap(QSize(16, 16)); gotoButton_->visual()->setLeadingIcon(folderIcon); } #ifdef Q_WS_MAC #ifdef QT_MAC_USE_COCOA connect(gotoButton_, SIGNAL(toggled(bool)), this, SLOT(blockFloating(bool))); #endif // QT_MAC_USE_COCOA #endif // Q_WS_MAC updateGotoMenu(); class QxCdUpButton: public QxControl { public: QxCdUpButton(QWidget* parent) : QxControl(parent, new QxVisual(styleManager()->style("fileBrowserCdUpButton"))) {} private: // workaround HACK, prevent undocking, map double click event to single click virtual void mouseDoubleClickEvent(QMouseEvent* event) { press(); event->accept(); } }; QxControl* cdUpButton = new QxCdUpButton(this); cdUpButton->setMode(QxControl::TouchMode); connect(cdUpButton, SIGNAL(pressed()), this, SLOT(cdUp())); //-------------------------------------------------------------------------- // define context actions contextMenu_ = new QMenu(this); // QxDesignHack::beautify(contextMenu_); openDefaultAction_ = new QAction(tr("Open in Default App."), this); openDefaultAction_->setShortcut(tr("Ctrl+D")); openDefaultAction_->setShortcutContext(Qt::WidgetShortcut); openFileAction_ = new QAction(tr("Open in %1").arg(qApp->applicationName()), this); createFileAction_ = contextMenu_->addAction(tr("New File")); createDirAction_ = contextMenu_->addAction(tr("New Folder")); contextMenu_->addSeparator(); contextMenu_->addAction(openFileAction_); contextMenu_->addAction(openDefaultAction_); contextMenu_->addSeparator(); renameAction_ = contextMenu_->addAction(tr("Rename")); deleteAction_ = contextMenu_->addAction(tr("Move To Trash")); contextMenu_->addSeparator(); bookmarkAction_ = contextMenu_->addAction(tr("Bookmark")); contextMenu_->addSeparator(); showHiddenAction_ = contextMenu_->addAction(tr("Show Hidden")); showDetailsAction_ = contextMenu_->addAction(tr("Show Details")); connect(createFileAction_, SIGNAL(triggered()), this, SLOT(createFile())); connect(createDirAction_, SIGNAL(triggered()), this, SLOT(createDir())); connect(openDefaultAction_, SIGNAL(triggered()), this, SLOT(openDefault())); connect(openFileAction_, SIGNAL(triggered()), this, SLOT(openFile())); connect(renameAction_, SIGNAL(triggered()), this, SLOT(rename())); connect(deleteAction_, SIGNAL(triggered()), this, SLOT(delete_())); connect(dirView_, SIGNAL(delKeyPressed()), this, SLOT(delete_())); connect(showHiddenAction_, SIGNAL(toggled(bool)), this, SLOT(showHidden(bool))); connect(showDetailsAction_, SIGNAL(toggled(bool)), this, SLOT(showDetails(bool))); connect(bookmarkAction_, SIGNAL(triggered()), this, SLOT(bookmark())); showHiddenAction_->setCheckable(true); showDetailsAction_->setCheckable(true); showHiddenAction_->setChecked(false); showDetailsAction_->setChecked(false); //-------------------------------------------------------------------------- // setup toolbar QxControl* plusButton = new QxControl(this, new QxVisual(styleManager()->style("fileBrowserPlusButton"))); plusButton->setMode(QxControl::TouchMode); connect(plusButton, SIGNAL(pressed()), this, SLOT(createFile())); QxControl* wheelButton = new QxControl(this, new QxVisual(styleManager()->style("fileBrowserWheelButton"))); wheelButton->setMenu(contextMenu_); wheelButton->setMenuPopupMode(QxControl::DownsideMenuPopup|QxControl::UpsideMenuPopup|QxControl::PreferUpsideMenuPopup); QxControl* recentButton = new QxControl(this, new QxVisual(styleManager()->style("fileBrowserRecentButton"))); recentButton->setMode(QxControl::TouchMode); connect(recentButton, SIGNAL(pressed()), this, SLOT(recentShowOrHide())); QxControl* bookmarksButton = new QxControl(this, new QxVisual(styleManager()->style("fileBrowserBookmarksButton"))); bookmarksButton->setMode(QxControl::TouchMode); connect(bookmarksButton, SIGNAL(pressed()), this, SLOT(bookmarksShowOrHide())); statusBar_ = new QxStatusBar(this); showHidden(false); showDetails(false); //-------------------------------------------------------------------------- // setup bottom views recentModel_ = new QxUrlListModel(this); recentView_ = new QxUrlListView(this); // recentView_->header()->hide(); // recentView_->setViewMode(QListView::IconMode); // recentView_->setIconSize(QSize(16, 16)); recentView_->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); recentView_->setVerticalScrollBarPolicy(Qt::ScrollBarAsNeeded); recentView_->setTextElideMode(Qt::ElideLeft); recentView_->setFrameStyle(QFrame::NoFrame); recentView_->setLineWidth(0); recentView_->setMidLineWidth(0); recentView_->setStyleSheet( "QListView::item {" " padding-top: 1px;" "}" ); // recentView_->setAlternatingRowColors(true); recentView_->setModel(recentModel_); connect(recentView_, SIGNAL(activated(const QModelIndex&)), this, SLOT(gotoRecent(const QModelIndex&))); recentContextMenu_ = new QMenu(this); recentContextMenu_->addAction(tr("Goto"), this, SLOT(gotoRecent())); recentContextMenu_->addAction(tr("Add To Bookmarks"), this, SLOT(recentAddToBookmarks())); bookmarksModel_ = new QxUrlListModel(this); bookmarksModel_->setPathReduction(1); bookmarksView_ = new QxUrlListView(this); bookmarksView_->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); bookmarksView_->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff); bookmarksView_->setTextElideMode(Qt::ElideLeft); bookmarksView_->setFrameStyle(QFrame::NoFrame); bookmarksView_->setLineWidth(0); bookmarksView_->setMidLineWidth(0); bookmarksView_->setStyleSheet( "QListView::item {" " padding-top: 1px;" "}" ); bookmarksView_->setModel(bookmarksModel_); bookmarksView_->setDragDropMode(QAbstractItemView::InternalMove); bookmarksView_->setDragEnabled(true); bookmarksView_->setAcceptDrops(true); bookmarksView_->setDropIndicatorShown(true); connect(bookmarksView_, SIGNAL(activated(const QModelIndex&)), this, SLOT(gotoBookmark(const QModelIndex&))); bookmarksContextMenu_ = new QMenu(this); bookmarksContextMenu_->addAction(tr("Add Current Directory"), this, SLOT(cwdAddToBookmark())); bookmarksContextMenu_->addAction(tr("Add Other Directory"), this, SLOT(addDirBookmark())); bookmarksContextMenu_->addSeparator(); bookmarksContextMenu_->addAction(tr("Goto Here"), this, SLOT(gotoBookmark())); bookmarksContextMenu_->addAction(tr("Remove From List"), this, SLOT(removeBookmark())); bookmarksContextMenu_->addSeparator(); bookmarksShowFullPathAction_ = bookmarksContextMenu_->addAction(tr("Show Full Path")); bookmarksShowFullPathAction_->setCheckable(true); bookmarksShowFullPathAction_->setChecked(bookmarksModel_->pathReduction() == -1); connect(bookmarksShowFullPathAction_, SIGNAL(toggled(bool)), this, SLOT(bookmarksShowFullPath(bool))); #ifdef Q_WS_MAC { QProxyStyle* proxyStyle = qobject_cast<QProxyStyle*>(style()); QMacStyle* macStyle = qobject_cast<QMacStyle*>((proxyStyle) ? proxyStyle->baseStyle() : style()); if (macStyle) { macStyle->setFocusRectPolicy(dirView_, QMacStyle::FocusDisabled); macStyle->setFocusRectPolicy(recentView_, QMacStyle::FocusDisabled); macStyle->setFocusRectPolicy(dirView_, QMacStyle::FocusDisabled); macStyle->setFocusRectPolicy(bookmarksView_, QMacStyle::FocusDisabled); } } #endif //-------------------------------------------------------------------------- // layout widgets handle_ = new QxControl(this, new QxVisual(styleManager()->style("fileBrowserSplitter"))); handle_->visual()->setText(""); handleTextRecent_ = tr("Recent Places"); handleTextBookmarks_ = tr("Bookmarks"); bottomStack_ = new QxControl(this); bottomStackLayout_ = new QStackedLayout; bottomStackLayout_->addWidget(recentView_); bottomStackLayout_->addWidget(bookmarksView_); bottomStack_->setLayout(bottomStackLayout_); bottomStack_->setVisible(false); splitter_ = new QxSplitter(this); splitter_->setOrientation(Qt::Vertical); splitter_->setHandle(1, handle_); splitter_->setHandleWidth(styleManager()->constant("fileBrowserSplitterWidth")); splitter_->addWidget(dirView_); /*{ QxControl* carrier = new QxControl(this, new QxVisual(styleManager()->style("fileBrowserDirView"))); QGridLayout* layout = new QGridLayout; layout->setSpacing(0); layout->setMargin(0); layout->addWidget(dirView_); carrier->setLayout(layout); splitter_->addWidget(carrier); }*/ splitter_->addWidget(bottomStack_); // make dirView_ grow/shrink dynamically, while bottomStack_ keeps user-defined size splitter_->setStretchFactor(0, 1); splitter_->setStretchFactor(1, 0); QDockWidget* dock = qobject_cast<QDockWidget*>(parent); if (dock) { dock->setWidget(this); // connect(dock, SIGNAL(dockLocationChanged(Qt::DockWidgetArea)), this, SLOT(adaptToDockLocation(Qt::DockWidgetArea))); } QVBoxLayout* col = new QVBoxLayout; col->setSpacing(0); col->setMargin(0); { QxControl* carrier = new QxControl(parent, new QxVisual(styleManager()->style("fileBrowserNavCarrier"))); QHBoxLayout* row = new QHBoxLayout; row->setSpacing(0); row->setMargin(0); row->addWidget(gotoButton_); row->addStretch(); row->addWidget(cdUpButton); carrier->setLayout(row); if (dock) dock->setTitleBarWidget(carrier); else col->addWidget(carrier); } col->addWidget(splitter_); col->addWidget(styleManager()->hl(this)); { QBoxLayout* row = new QBoxLayout(QBoxLayout::LeftToRight); row->setSpacing(0); row->setMargin(0); row->addWidget(plusButton); row->addWidget(styleManager()->vl(this)); row->addWidget(wheelButton); row->addWidget(styleManager()->vl(this)); row->addWidget(recentButton); row->addWidget(styleManager()->vl(this)); row->addWidget(bookmarksButton); row->addWidget(styleManager()->vl(this)); row->addWidget(statusBar_); col->addLayout(row); bottomToolLayout_ = row; } setLayout(col); }
Window::Window(QWidget* parent) : QMainWindow(parent) { setObjectName("ChatWindow"); Settings::getInstance().load(); connect(&Settings::getInstance(), &Settings::dataChanged, this, &Window::applySettings); QToolBar* toolbar = new QToolBar(this); toolbar->setIconSize(QSize(24, 24)); toolbar->setFloatable(false); toolbar->setContextMenuPolicy(Qt::PreventContextMenu); addToolBar(toolbar); //QAction* refreshAction = toolbar->addAction(QIcon(":/icons/refresh.png"), "refresh"); //connect(refreshAction, SIGNAL(triggered()), this, SLOT(refreshPlanets())); QDockWidget* inputDock = new QDockWidget(this); inputDock->setObjectName("Input dock"); inputDock->setFeatures(QDockWidget::NoDockWidgetFeatures); inputDock->setTitleBarWidget(new QWidget(inputDock)); inputDock->setContextMenuPolicy(Qt::PreventContextMenu); addDockWidget(Qt::BottomDockWidgetArea, inputDock); QWidget* inputDockWidget = new QWidget(inputDock); QHBoxLayout* inputDockWidgetLayout = new QHBoxLayout(inputDockWidget); nickLabel = new QLabel(inputDockWidget); nickLabel->hide(); inputLine = new QLineEdit(inputDockWidget); connect(inputLine, &QLineEdit::returnPressed, this, &Window::sendMessage); inputDockWidgetLayout->addWidget(nickLabel); inputDockWidgetLayout->addWidget(inputLine); inputDockWidgetLayout->setContentsMargins(2, 2, 2, 6); inputDockWidget->setLayout(inputDockWidgetLayout); inputDock->setFixedHeight(inputDock->height()); inputDock->setWidget(inputDockWidget); QDockWidget* tabDock = new QDockWidget(this); tabDock->setObjectName("Tab dock"); tabDock->setFeatures(QDockWidget::NoDockWidgetFeatures); tabDock->setTitleBarWidget(new QWidget(tabDock)); tabDock->setContextMenuPolicy(Qt::PreventContextMenu); addDockWidget(Qt::LeftDockWidgetArea, tabDock); setCorner(Qt::BottomLeftCorner, Qt::LeftDockWidgetArea); setCorner(Qt::TopLeftCorner, Qt::LeftDockWidgetArea); tabTree = new TabTree(tabDock, 100); tabTree->setHeaderLabel("Chats"); tabTree->setIndentation(8); tabTree->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); tabTree->setMinimumWidth(1); tabTree->setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Preferred); tabDock->setWidget(tabTree); tabTree->setContextMenuPolicy(Qt::CustomContextMenu); connect(tabTree, &QTreeWidget::itemSelectionChanged, this, &Window::tabSelected); connect(tabTree, &QTreeWidget::customContextMenuRequested, this, &Window::showTabTreeContextMenu); QAction* connectAction = new QAction(QIcon(":/icons/connect.png"), "Connect", toolbar); QAction* disconnectAction = new QAction(QIcon(":/icons/disconnect.png"), "Disconnect", toolbar); QAction* settingsAction = toolbar->addAction(QIcon(":/icons/settings.png"), "Settings"); connect(connectAction, &QAction::triggered, this, &Window::connectToServer); connect(disconnectAction, &QAction::triggered, this, &Window::disconnectFromServer); connect(settingsAction, &QAction::triggered, this, &Window::showSettingsDialog); toolbar->addActions(QList<QAction*>() << connectAction << disconnectAction << settingsAction); serverTab = new QTreeWidgetItem(tabTree, QStringList() << "IRC Server"); tabTree->addTopLevelItem(serverTab); userDock = new QDockWidget(this); userDock->setObjectName("User dock"); userDock->setFeatures(QDockWidget::NoDockWidgetFeatures); userDock->setTitleBarWidget(new QWidget(userDock)); userDock->setContextMenuPolicy(Qt::PreventContextMenu); addDockWidget(Qt::RightDockWidgetArea, userDock); setCorner(Qt::BottomRightCorner, Qt::RightDockWidgetArea); setCorner(Qt::TopRightCorner, Qt::RightDockWidgetArea); userTree = new UserTree(userDock, 100); userTree->setItemsExpandable(false); userTree->setIndentation(8); userTree->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); userTree->setMinimumWidth(1); userTree->setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Preferred); userDock->setWidget(userTree); connect(userTree, &UserTree::privateActionTriggered, this, &Window::startPrivate); topicDock = new QDockWidget(this); topicDock->setObjectName("Topic dock"); topicDock->setFeatures(QDockWidget::NoDockWidgetFeatures); topicDock->setTitleBarWidget(new QWidget(topicDock)); topicDock->setContextMenuPolicy(Qt::PreventContextMenu); addDockWidget(Qt::TopDockWidgetArea, topicDock); topicLine = new TopicLabel(topicDock); topicDock->setWidget(topicLine); QMainWindow* pagesWindow = new QMainWindow(0); pages = new QStackedWidget(pagesWindow); serverPage = new ServerPage(serverTab, tabTree); connect(serverPage, &ServerPage::connectActionTriggered, this, &Window::connectToServer); connect(serverPage, &ServerPage::disconnectActionTriggered, this, &Window::disconnectFromServer); pagesWindow->setCentralWidget(pages); pages->addWidget(serverPage); setCentralWidget(pagesWindow); tabTree->setItemSelected(serverTab, true); autojoinTimer = new QTimer(this); autojoinTimer->setSingleShot(true); connect(autojoinTimer, &QTimer::timeout, this, &Window::joinChannels); applySettings(); ircClient->setVersion(QString("%1 %2 by %3; build date: %4").arg(MainWindow::name).arg(MainWindow::version).arg(MainWindow::author).arg(MainWindow::buildDate)); connect(ircClient, &IrcClient::IrcClient::notice, serverPage, &ServerPage::notice); connect(ircClient, &IrcClient::IrcClient::serverResponse, serverPage, &ServerPage::serverResponse); connect(ircClient, &IrcClient::IrcClient::ctcpRequest, serverPage, &ServerPage::ctcpRequest); connect(ircClient, &IrcClient::IrcClient::ctcpReply, serverPage, &ServerPage::ctcpReply); connect(ircClient, &IrcClient::IrcClient::quit, serverPage, &ServerPage::quit); connect(ircClient, &IrcClient::IrcClient::connecting, serverPage, &ServerPage::connecting); connect(ircClient, &IrcClient::IrcClient::disconnected, serverPage, &ServerPage::disconnected); connect(ircClient, &IrcClient::IrcClient::userModeChanged, serverPage, &ServerPage::userModeChanged); connect(ircClient, &IrcClient::IrcClient::join, this, &Window::joinedChannel); connect(ircClient, &IrcClient::IrcClient::connected, this, &Window::connected); connect(ircClient, &IrcClient::IrcClient::privateMessage, this, &Window::routePrivateMessage); connect(ircClient, &IrcClient::IrcClient::action, this, &Window::routePrivateAction); connect(ircClient, &IrcClient::IrcClient::nickChange, nickLabel, &QLabel::setText); connect(ircClient, &IrcClient::IrcClient::connected, nickLabel, &QLabel::show); connect(ircClient, &IrcClient::IrcClient::disconnected, nickLabel, &QLabel::hide); if (Settings::getInstance().getAutoConnect()) { connectToServer(); } ::Settings::loadWindow(this); }
void MainWindow::createDockWidget() { signalMapper = new QSignalMapper(this); // Header Widget QWidget* headerWidget = new QWidget; headerWidget->setFixedHeight(109); QDockWidget* headerDockWidget = new QDockWidget(this); headerDockWidget->setObjectName("headerDockWidget"); headerDockWidget->setFloating(false); headerDockWidget->setTitleBarWidget(new QWidget); headerDockWidget->setWidget(headerWidget); this->addDockWidget(Qt::TopDockWidgetArea,headerDockWidget); // Right Panel Widget rightPanelWidget = new QWidget; rightPanelWidget->setObjectName("rightPanelWidget"); rightPanelWidget->setFixedWidth(213); rightPanelWidget->setFixedHeight(481); QDockWidget* rightDockWidget = new QDockWidget(this); rightDockWidget->setObjectName("rightDockWidget"); rightDockWidget->setFloating(false); rightDockWidget->setTitleBarWidget(new QWidget); rightDockWidget->setWidget(rightPanelWidget); this->addDockWidget(Qt::RightDockWidgetArea,rightDockWidget); // Set geometry for each button at fixed place. int y_aix = 8; int x_aix = 15; int button_height = 58; int button_width = 183; int spacing = 1 ; QPushButton* homeButton = new QPushButton(rightPanelWidget); homeButton->setObjectName("0_toolButton"); homeButton->setGeometry(x_aix,y_aix,button_width,button_height); homeButton->setStyleSheet("QPushButton {background-image: url(:/images/home.png);background-color: transparent;} QPushButton:hover {background-image: url(:/images/home-hover.png);background-color: transparent;} QPushButton:pressed,QPushButton:checked {background-image: url(:/images/home-checked.png);background-color: transparent;}"); homeButton->setCheckable(true); homeButton->setChecked(true); homeButton->setToolTip("الرئيسية"); homeButton->setStatusTip("البداية لحاجب ويمكنك من خلالها التحكم في عمل خدمات حاحب على كل المستخدمين بالاضافة الى خيارات اخرى ..."); connect(homeButton,SIGNAL(clicked()),signalMapper,SLOT(map())); signalMapper->setMapping(homeButton,Home); y_aix += button_height + spacing; QPushButton* userSettingsButton = new QPushButton(rightPanelWidget); userSettingsButton->setObjectName("1_toolButton"); userSettingsButton->setGeometry(x_aix,y_aix,button_width,button_height); userSettingsButton->setStyleSheet("QPushButton {background-image: url(:/images/userSettings.png);background-color: transparent;} QPushButton:hover {background-image: url(:/images/userSettings-hover.png);background-color: transparent;} QPushButton:pressed,QPushButton:checked {background-image: url(:/images/userSettings-checked.png);background-color: transparent;}"); userSettingsButton->setCheckable(true); userSettingsButton->setToolTip("إعدادات المستخدم"); userSettingsButton->setStatusTip("إعدادات المستخدم تمكنك من تفعيل او تعطيل خدمات حاجب لمستخدم ما ..."); connect(userSettingsButton,SIGNAL(clicked()),signalMapper,SLOT(map())); signalMapper->setMapping(userSettingsButton,UserSettings); y_aix += button_height + spacing; QPushButton* serviceLogButton = new QPushButton(rightPanelWidget); serviceLogButton->setObjectName("2_toolButton"); serviceLogButton->setGeometry(x_aix,y_aix,button_width,button_height); serviceLogButton->setStyleSheet("QPushButton {background-image: url(:/images/userLogs.png);background-color: transparent;} QPushButton:hover {background-image: url(:/images/userLogs-hover.png);background-color: transparent;} QPushButton:pressed,QPushButton:checked {background-image: url(:/images/userLogs-checked.png);background-color: transparent;}"); serviceLogButton->setCheckable(true); serviceLogButton->setToolTip("سجلات المستخدمين"); serviceLogButton->setStatusTip("من خلال السجلات يمكنك متابعة كافة الأحداث لكل المستخدمين ..."); connect(serviceLogButton,SIGNAL(clicked()),signalMapper,SLOT(map())); signalMapper->setMapping(serviceLogButton,ServiceLog); y_aix += button_height + spacing; QPushButton* screenshotMonitorButton = new QPushButton(rightPanelWidget); screenshotMonitorButton->setObjectName("3_toolButton"); screenshotMonitorButton->setGeometry(x_aix,y_aix,button_width,button_height); screenshotMonitorButton->setStyleSheet("QPushButton {background-image: url(:/images/screenshotsMonitor.png);background-color: transparent;} QPushButton:hover {background-image: url(:/images/screenshotsMonitor-hover.png);background-color: transparent;} QPushButton:pressed,QPushButton:checked {background-image: url(:/images/screenshotsMonitor-checked.png);background-color: transparent;}"); screenshotMonitorButton->setCheckable(true); screenshotMonitorButton->setToolTip("مراقبة الشاشة"); screenshotMonitorButton->setStatusTip("مشاهدة لقطات الشاشة لكل المستخدمين والتحكم بوقت أخذ اللقطات ..."); connect(screenshotMonitorButton,SIGNAL(clicked()),signalMapper,SLOT(map())); signalMapper->setMapping(screenshotMonitorButton,ScreenshotMonitor); y_aix += button_height + spacing; QPushButton* surfeTimeButton = new QPushButton(rightPanelWidget); surfeTimeButton->setObjectName("4_toolButton"); surfeTimeButton->setGeometry(x_aix,y_aix,button_width,button_height); surfeTimeButton->setStyleSheet("QPushButton {background-image: url(:/images/browseTime.png);background-color: transparent;} QPushButton:hover {background-image: url(:/images/browseTime-hover.png);background-color: transparent;} QPushButton:pressed,QPushButton:checked {background-image: url(:/images/browseTime-checked.png);background-color: transparent;}"); surfeTimeButton->setCheckable(true); surfeTimeButton->setToolTip("زمن التصفح"); surfeTimeButton->setStatusTip("تحديد وقت تصفح الاتنرنت لكل مستخدم لكافة أيام الأسبوع ..."); connect(surfeTimeButton,SIGNAL(clicked()),signalMapper,SLOT(map())); signalMapper->setMapping(surfeTimeButton,SurfTime); y_aix += button_height + spacing; QPushButton* websiteLockButton = new QPushButton(rightPanelWidget); websiteLockButton->setObjectName("5_toolButton"); websiteLockButton->setGeometry(x_aix,y_aix,button_width,button_height); websiteLockButton->setStyleSheet("QPushButton {background-image: url(:/images/websiteLock.png);background-color: transparent;} QPushButton:hover {background-image: url(:/images/websiteLock-hover.png);background-color: transparent;} QPushButton:pressed,QPushButton:checked {background-image: url(:/images/websiteLock-checked.png);background-color: transparent;}"); websiteLockButton->setCheckable(true); websiteLockButton->setToolTip("حظر المواقع"); websiteLockButton->setStatusTip("اضافة وازالة موقع من قائمة المواقع المحظورة ..."); connect(websiteLockButton,SIGNAL(clicked()),signalMapper,SLOT(map())); signalMapper->setMapping(websiteLockButton,WebsiteLocker); y_aix += button_height + spacing; QPushButton* programLockButton = new QPushButton(rightPanelWidget); programLockButton->setObjectName("6_toolButton"); programLockButton->setGeometry(x_aix,y_aix,button_width,button_height); programLockButton->setStyleSheet("QPushButton {background-image: url(:/images/programLock.png);background-color: transparent;} QPushButton:hover {background-image: url(:/images/programLock-hover.png);background-color: transparent;} QPushButton:pressed,QPushButton:checked {background-image: url(:/images/programLock-checked.png);background-color: transparent;}"); programLockButton->setCheckable(true); programLockButton->setToolTip("حظر البرامج"); programLockButton->setStatusTip("اضافة وازالة برنامج من قائمة البرامج المحظورة ..."); connect(programLockButton,SIGNAL(clicked()),signalMapper,SLOT(map())); signalMapper->setMapping(programLockButton,ProgramLocker); connect(signalMapper,SIGNAL(mapped(int)),this,SLOT(setCurrentWindow(int))); }
MainWindow::MainWindow(QWidget* parent) : QMainWindow(parent) { const int screenWidth = QApplication::desktop()->width(); const int screenHeight = QApplication::desktop()->height(); const int appWidth = 500; const int appHeight = 300; setGeometry((screenWidth - appWidth) / 2, (screenHeight - appHeight) / 2, appWidth, appHeight); setWindowTitle("developers' test version, not for public use"); QDockWidget* friendDock = new QDockWidget(this); friendDock->setFeatures(QDockWidget::NoDockWidgetFeatures); friendDock->setTitleBarWidget(new QWidget(friendDock)); friendDock->setContextMenuPolicy(Qt::PreventContextMenu); addDockWidget(Qt::LeftDockWidgetArea, friendDock); QWidget* friendDockWidget = new QWidget(friendDock); QVBoxLayout* layout = new QVBoxLayout(friendDockWidget); layout->setMargin(0); layout->setSpacing(0); ourUserItem = new OurUserItemWidget(this); friendsWidget = new FriendsWidget(friendDockWidget); layout->addWidget(ourUserItem); layout->addWidget(friendsWidget); friendDock->setWidget(friendDockWidget); PagesWidget* pages = new PagesWidget(this); connect(friendsWidget, &FriendsWidget::friendAdded, pages, &PagesWidget::addPage); connect(friendsWidget, &FriendsWidget::friendRemoved, pages, &PagesWidget::removePage); connect(friendsWidget, &FriendsWidget::friendSelectionChanged, pages, &PagesWidget::activatePage); connect(friendsWidget, &FriendsWidget::friendRenamed, pages, &PagesWidget::usernameChanged); connect(friendsWidget, &FriendsWidget::friendStatusChanged, pages, &PagesWidget::statusChanged); //FIXME: execute dhtDialog before MainWindow in main.cpp DhtDialog dhtDialog(this); if (dhtDialog.exec() != QDialog::Accepted) { QTimer::singleShot(250, qApp, SLOT(quit())); } //FIXME: start core in a separate function //all connections to `core` should be done after its creation because it registers some types core = new Core(dhtDialog.getUserId(), dhtDialog.getIp(), dhtDialog.getPort()); coreThread = new QThread(this); core->moveToThread(coreThread); connect(coreThread, &QThread::started, core, &Core::start); coreThread->start(/*QThread::IdlePriority*/); connect(core, &Core::friendRequestRecieved, this, &MainWindow::onFriendRequestRecieved); connect(core, &Core::friendStatusChanged, this, &MainWindow::onFriendStatusChanged); connect(core, &Core::userIdGererated, ourUserItem, &OurUserItemWidget::setUserId); connect(core, &Core::friendAdded, friendsWidget, &FriendsWidget::addFriend); connect(core, &Core::friendMessageRecieved, pages, &PagesWidget::messageReceived); connect(this, &MainWindow::friendRequestAccepted, core, &Core::acceptFirendRequest); connect(pages, &PagesWidget::messageSent, core, &Core::sendMessage); connect(friendsWidget, &FriendsWidget::friendRequested, core, &Core::requestFriendship); connect(friendsWidget, &FriendsWidget::friendRemoved, core, &Core::removeFriend); setCentralWidget(pages); }