void tst_QTabBar::closeButton() { QTabBar tabbar; QCOMPARE(tabbar.tabsClosable(), false); tabbar.setTabsClosable(true); QCOMPARE(tabbar.tabsClosable(), true); tabbar.addTab("foo"); QTabBar::ButtonPosition closeSide = (QTabBar::ButtonPosition)tabbar.style()->styleHint(QStyle::SH_TabBar_CloseButtonPosition, 0, &tabbar); QTabBar::ButtonPosition otherSide = (closeSide == QTabBar::LeftSide ? QTabBar::RightSide : QTabBar::LeftSide); QVERIFY(tabbar.tabButton(0, otherSide) == 0); QVERIFY(tabbar.tabButton(0, closeSide) != 0); QAbstractButton *button = static_cast<QAbstractButton*>(tabbar.tabButton(0, closeSide)); QVERIFY(button); QSignalSpy spy(&tabbar, SIGNAL(tabCloseRequested(int))); button->click(); QCOMPARE(tabbar.count(), 1); QCOMPARE(spy.count(), 1); }
CFileListWidget::CFileListWidget(UINT Mode, QWidget *parent) :QWidget(parent) { m_Mode = Mode; m_Ops = Mode2Str(Mode); m_CurID = 0; m_pGrabbingsSyncJob = NULL; m_OldPending = 0; m_pMainLayout = new QVBoxLayout(); m_pMainLayout->setMargin(1); m_pSplitter = new QSplitter(); m_pSplitter->setOrientation(Qt::Vertical); m_pFileList = new CFileListView(Mode); connect(m_pFileList, SIGNAL(FileItemClicked(uint64, bool)), this, SLOT(OnFileItemClicked(uint64, bool))); connect(m_pFileList, SIGNAL(StreamFile(uint64, const QString&, bool)), this, SIGNAL(StreamFile(uint64, const QString&, bool))); connect(m_pFileList, SIGNAL(TogleDetails()), this, SIGNAL(TogleDetails())); m_pSubWidget = new QWidget(); m_pSubLayout = new QVBoxLayout(); m_pSubLayout->setMargin(0); m_pSubLayout->addWidget(m_pFileList); // m_pFinder = new CFinder(); m_pSubLayout->addWidget(m_pFinder); QObject::connect(m_pFinder, SIGNAL(SetFilter(const QRegExp&)), m_pFileList, SLOT(SetFilter(const QRegExp&))); QAction* pFinder = new QAction(tr("&Find ..."), this); pFinder->setShortcut(QKeySequence::Find); pFinder->setShortcutContext(Qt::WidgetWithChildrenShortcut); this->addAction(pFinder); QObject::connect(pFinder, SIGNAL(triggered()), m_pFinder, SLOT(Open())); // m_pSubWidget->setLayout(m_pSubLayout); m_pSplitter->addWidget(m_pSubWidget); m_pFileTabs = new QTabWidget(); m_pSummary = new CFileSummary(Mode); m_pFileTabs->addTab(m_pSummary, tr("Summary")); m_pDetails = new CDetailsView(Mode); m_pFileTabs->addTab(m_pDetails, tr("Details")); //QMultiMap<int, SField> Settings; //SetupFile(Settings); //m_pSettings = new CFileSettingsView(Settings); //m_pFileTabs->addTab(m_pSettings, tr("Settings")); if(theGUI->Cfg()->GetInt("Gui/AdvancedControls")) { m_pTransfers = new CTransfersView(CTransfersView::eTransfers); m_pFileTabs->addTab(m_pTransfers, tr("Transfers")); connect(m_pTransfers, SIGNAL(OpenTransfer(uint64, uint64)), this, SLOT(OpenLog(uint64, uint64))); } else m_pTransfers = NULL; m_pSubFiles = new CFileListView(CFileListView::eSubFiles); m_pFileTabs->addTab(m_pSubFiles, tr("Sub Files")); m_pHosting = new CHostingView(); m_pFileTabs->addTab(m_pHosting, tr("Hosting")); if(theGUI->Cfg()->GetInt("Gui/AdvancedControls")) { m_pTracker = new CTrackerView(); m_pFileTabs->addTab(m_pTracker, tr("Tracker")); } else m_pTracker = NULL; m_pRating = new CRatingView(); connect(m_pRating, SIGNAL(FindRating()), m_pFileList, SLOT(OnFindRating())); connect(m_pRating, SIGNAL(ClearRating()), m_pFileList, SLOT(OnClearRating())); m_pFileTabs->addTab(m_pRating, tr("Rating")); if(theGUI->Cfg()->GetInt("Gui/AdvancedControls") == 1) { m_pProperties = new CPropertiesView(true); m_pFileTabs->addTab(m_pProperties, tr("Properties")); } else m_pProperties = NULL; if(theGUI->Cfg()->GetBool("Gui/ShowLog")) { m_pLogView = new CLogView(); m_pFileTabs->addTab(m_pLogView, tr("Log")); } else m_pLogView = NULL; // Make all additionaly added tabs closable - client log tab m_pFileTabs->setTabsClosable(true); QTabBar* pTabBar = m_pFileTabs->tabBar(); m_TabOffset = m_pFileTabs->count(); for(int i=0; i < m_TabOffset; i++) pTabBar->setTabButton(i,static_cast<QTabBar::ButtonPosition>(pTabBar->style()->styleHint(QStyle::SH_TabBar_CloseButtonPosition, 0, pTabBar)),0); connect(pTabBar, SIGNAL(tabCloseRequested(int)), this, SLOT(CloseLog(int))); m_pSplitter->addWidget(m_pFileTabs); m_pMainLayout->addWidget(m_pSplitter); m_pProgress = new QProgressBar(); m_pProgress->setVisible(false); m_pProgress->setMinimum(0); m_pProgress->setMaximum(100); m_pMainLayout->addWidget(m_pProgress); setLayout(m_pMainLayout); connect(m_pFileTabs, SIGNAL(currentChanged(int)), this, SLOT(OnTab(int))); m_pSplitter->restoreState(theGUI->Cfg()->GetBlob("Gui/Widget_" + m_Ops + "_Spliter")); m_pFileTabs->setCurrentIndex(theGUI->Cfg()->GetSetting("Gui/Widget_" + m_Ops + "_Detail").toInt()); m_TimerId = startTimer(1000); }
int main(int argc, char *argv[]) { QApplication app(argc, argv); auto *proxyStyle = new TabBarProxyStyle; app.setStyle(proxyStyle); QWidget widget; QStackedWidget stackedWidget; QTabBar tabBar; tabBar.setDocumentMode(true); tabBar.setTabsClosable(true); tabBar.setMovable(true); tabBar.setExpanding(false); // top tabBar.setShape(QTabBar::RoundedNorth); // bottom // tabBar.setShape(QTabBar::RoundedSouth); // left // tabBar.setShape(QTabBar::RoundedWest); // right // tabBar.setShape(QTabBar::RoundedEast); const auto shortLabel = QStringLiteral("Tab %1"); const auto longLabel = QStringLiteral("An Extremely Long Tab Label %1"); QMap<int, QWidget*> tabs; for (int i = 0; i < TabCount; i++) { QString tabNumberString = QString::number(i); QLabel *label = new QLabel(QStringLiteral("Tab %1 content").arg(tabNumberString)); tabs[i] = label; label->setAlignment(Qt::AlignCenter); stackedWidget.addWidget(label); tabBar.addTab(shortLabel.arg(tabNumberString)); } QObject::connect(&tabBar, &QTabBar::tabMoved, [&tabs](int from, int to) { QWidget *thisWidget = tabs[from]; QWidget *thatWidget = tabs[to]; tabs[from] = thatWidget; tabs[to] = thisWidget; }); QObject::connect(&tabBar, &QTabBar::currentChanged, [&stackedWidget, &tabs](int index) { if (index >= 0) stackedWidget.setCurrentWidget(tabs[index]); }); QObject::connect(&tabBar, &QTabBar::tabCloseRequested, [&stackedWidget, &tabBar, &tabs](int index) { QWidget *widget = tabs[index]; tabBar.removeTab(index); for (int i = index + 1; i < TabCount; i++) tabs[i-1] = tabs[i]; int currentIndex = tabBar.currentIndex(); if (currentIndex >= 0) stackedWidget.setCurrentWidget(tabs[currentIndex]); delete widget; }); QLayout *layout; switch (tabBar.shape()) { case QTabBar::RoundedEast: case QTabBar::TriangularEast: tabBar.setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Expanding); layout = new QHBoxLayout(&widget); layout->addWidget(&stackedWidget); layout->addWidget(&tabBar); break; case QTabBar::RoundedWest: case QTabBar::TriangularWest: tabBar.setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Expanding); layout = new QHBoxLayout(&widget); layout->addWidget(&tabBar); layout->addWidget(&stackedWidget); break; case QTabBar::RoundedNorth: case QTabBar::TriangularNorth: tabBar.setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Minimum); layout = new QVBoxLayout(&widget); layout->addWidget(&tabBar); layout->addWidget(&stackedWidget); break; case QTabBar::RoundedSouth: case QTabBar::TriangularSouth: tabBar.setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Minimum); layout = new QVBoxLayout(&widget); layout->addWidget(&stackedWidget); layout->addWidget(&tabBar); break; } TabBarForm form; layout->addWidget(&form); layout->setAlignment(&form, Qt::AlignHCenter); form.ui->documentModeButton->setChecked(tabBar.documentMode()); QObject::connect(form.ui->documentModeButton, &QCheckBox::toggled, [&] { tabBar.setDocumentMode(form.ui->documentModeButton->isChecked()); // QMacStyle (and maybe other styles) requires a re-polish to get the right font QApplication::sendEvent(&tabBar, new QEvent(QEvent::ThemeChange)); }); form.ui->movableTabsButton->setChecked(tabBar.isMovable()); QObject::connect(form.ui->movableTabsButton, &QCheckBox::toggled, [&] { tabBar.setMovable(form.ui->movableTabsButton->isChecked()); tabBar.update(); }); form.ui->closableTabsButton->setChecked(tabBar.tabsClosable()); QObject::connect(form.ui->closableTabsButton, &QCheckBox::toggled, [&] { tabBar.setTabsClosable(form.ui->closableTabsButton->isChecked()); tabBar.update(); }); form.ui->expandingTabsButton->setChecked(tabBar.expanding()); QObject::connect(form.ui->expandingTabsButton, &QCheckBox::toggled, [&] { tabBar.setExpanding(form.ui->expandingTabsButton->isChecked()); tabBar.update(); }); form.ui->displayIconButton->setChecked(!tabBar.tabIcon(0).isNull()); QObject::connect(form.ui->displayIconButton, &QCheckBox::toggled, [&] { const auto icon = form.ui->displayIconButton->isChecked() ? tabBar.style()->standardIcon(QStyle::SP_ComputerIcon) : QIcon(); for (int i = 0; i < tabBar.count(); i++) tabBar.setTabIcon(i, icon); }); form.ui->longLabelButton->setChecked(false); QObject::connect(form.ui->longLabelButton, &QCheckBox::toggled, [&] { const auto &label = form.ui->longLabelButton->isChecked() ? longLabel : shortLabel; for (int i = 0; i < tabBar.count(); i++) tabBar.setTabText(i, label.arg(i)); }); QObject::connect(form.ui->shapeComboBox, QOverload<int>::of(&QComboBox::currentIndexChanged), [&](int index) { Q_UNUSED(index); // TODO }); if (proxyStyle->alignment == Qt::AlignLeft) form.ui->leftAlignedButton->setChecked(true); else if (proxyStyle->alignment == Qt::AlignRight) form.ui->rightAlignedButton->setChecked(true); else form.ui->centeredButton->setChecked(true); QObject::connect(form.ui->textAlignmentGroup, QOverload<QAbstractButton *>::of(&QButtonGroup::buttonClicked), [&](QAbstractButton *b) { proxyStyle->alignment = b == form.ui->leftAlignedButton ? Qt::AlignLeft : b == form.ui->rightAlignedButton ? Qt::AlignRight : Qt::AlignCenter; QApplication::sendEvent(&tabBar, new QEvent(QEvent::StyleChange)); }); layout->setMargin(12); widget.show(); return app.exec(); }