📄 mainwindow.cpp
字号:
if (ok) ok = restoreState(layout_data); if (!ok) { QString msg = tr("Error reading %1") .arg(fileName); QMessageBox::warning(this, tr("Error"), msg); return; }}QAction *addAction(QMenu *menu, const QString &text, QActionGroup *group, QSignalMapper *mapper, int id){ bool first = group->actions().isEmpty(); QAction *result = menu->addAction(text); result->setCheckable(true); result->setChecked(first); group->addAction(result); QObject::connect(result, SIGNAL(triggered()), mapper, SLOT(map())); mapper->setMapping(result, id); return result;}class BlueTitleBar : public QWidget{ Q_OBJECTpublic: BlueTitleBar(QWidget *parent = 0); QSize sizeHint() const { return minimumSizeHint(); } QSize minimumSizeHint() const;protected: void paintEvent(QPaintEvent *event); void mousePressEvent(QMouseEvent *event);private: QPixmap leftPm, centerPm, rightPm;};QSize BlueTitleBar::minimumSizeHint() const{ QDockWidget *dw = qobject_cast<QDockWidget*>(parentWidget()); Q_ASSERT(dw != 0); QSize result(leftPm.width() + rightPm.width(), centerPm.height()); if (dw->features() & QDockWidget::DockWidgetVerticalTitleBar) result.transpose(); return result;}BlueTitleBar::BlueTitleBar(QWidget *parent) : QWidget(parent){ leftPm = QPixmap(":/res/titlebarLeft.png"); centerPm = QPixmap(":/res/titlebarCenter.png"); rightPm = QPixmap(":/res/titlebarRight.png");}void BlueTitleBar::paintEvent(QPaintEvent*){ QPainter painter(this); QRect rect = this->rect(); QDockWidget *dw = qobject_cast<QDockWidget*>(parentWidget()); Q_ASSERT(dw != 0); if (dw->features() & QDockWidget::DockWidgetVerticalTitleBar) { QSize s = rect.size(); s.transpose(); rect.setSize(s); painter.translate(rect.left(), rect.top() + rect.width()); painter.rotate(-90); painter.translate(-rect.left(), -rect.top()); } painter.drawPixmap(rect.topLeft(), leftPm); painter.drawPixmap(rect.topRight() - QPoint(rightPm.width() - 1, 0), rightPm); QBrush brush(centerPm); painter.fillRect(rect.left() + leftPm.width(), rect.top(), rect.width() - leftPm.width() - rightPm.width(), centerPm.height(), centerPm);}void BlueTitleBar::mousePressEvent(QMouseEvent *event){ QPoint pos = event->pos(); QRect rect = this->rect(); QDockWidget *dw = qobject_cast<QDockWidget*>(parentWidget()); Q_ASSERT(dw != 0); if (dw->features() & QDockWidget::DockWidgetVerticalTitleBar) { QPoint p = pos; pos.setX(rect.left() + rect.bottom() - p.y()); pos.setY(rect.top() + p.x() - rect.left()); QSize s = rect.size(); s.transpose(); rect.setSize(s); } const int buttonRight = 7; const int buttonWidth = 20; int right = rect.right() - pos.x(); int button = (right - buttonRight)/buttonWidth; switch (button) { case 0: event->accept(); dw->close(); break; case 1: event->accept(); dw->setFloating(!dw->isFloating()); break; case 2: { event->accept(); QDockWidget::DockWidgetFeatures features = dw->features(); if (features & QDockWidget::DockWidgetVerticalTitleBar) features &= ~QDockWidget::DockWidgetVerticalTitleBar; else features |= QDockWidget::DockWidgetVerticalTitleBar; dw->setFeatures(features); break; } default: event->ignore(); break; }}void MainWindow::setupDockWidgets(const QMap<QString, QSize> &customSizeHints){ mapper = new QSignalMapper(this); connect(mapper, SIGNAL(mapped(int)), this, SLOT(setCorner(int))); QMenu *corner_menu = dockWidgetMenu->addMenu(tr("Top left corner")); QActionGroup *group = new QActionGroup(this); group->setExclusive(true); ::addAction(corner_menu, tr("Top dock area"), group, mapper, 0); ::addAction(corner_menu, tr("Left dock area"), group, mapper, 1); corner_menu = dockWidgetMenu->addMenu(tr("Top right corner")); group = new QActionGroup(this); group->setExclusive(true); ::addAction(corner_menu, tr("Top dock area"), group, mapper, 2); ::addAction(corner_menu, tr("Right dock area"), group, mapper, 3); corner_menu = dockWidgetMenu->addMenu(tr("Bottom left corner")); group = new QActionGroup(this); group->setExclusive(true); ::addAction(corner_menu, tr("Bottom dock area"), group, mapper, 4); ::addAction(corner_menu, tr("Left dock area"), group, mapper, 5); corner_menu = dockWidgetMenu->addMenu(tr("Bottom right corner")); group = new QActionGroup(this); group->setExclusive(true); ::addAction(corner_menu, tr("Bottom dock area"), group, mapper, 6); ::addAction(corner_menu, tr("Right dock area"), group, mapper, 7); dockWidgetMenu->addSeparator(); static const struct Set { const char * name; uint flags; Qt::DockWidgetArea area; } sets [] = {#ifndef Q_WS_MAC { "Black", 0, Qt::LeftDockWidgetArea },#else { "Black", Qt::Drawer, Qt::LeftDockWidgetArea },#endif { "White", 0, Qt::RightDockWidgetArea }, { "Red", 0, Qt::TopDockWidgetArea }, { "Green", 0, Qt::TopDockWidgetArea }, { "Blue", 0, Qt::BottomDockWidgetArea }, { "Yellow", 0, Qt::BottomDockWidgetArea } }; const int setCount = sizeof(sets) / sizeof(Set); for (int i = 0; i < setCount; ++i) { ColorSwatch *swatch = new ColorSwatch(tr(sets[i].name), this, Qt::WindowFlags(sets[i].flags)); if (i%2) swatch->setWindowIcon(QIcon(QPixmap(":/res/qt.png"))); if (qstrcmp(sets[i].name, "Blue") == 0) { swatch->setTitleBarWidget(new BlueTitleBar(swatch));#ifdef Q_WS_QWS QPalette pal = palette(); pal.setBrush(backgroundRole(), QColor(0,0,0,0)); swatch->setPalette(pal);#endif } QString name = QString::fromLatin1(sets[i].name); if (customSizeHints.contains(name)) swatch->setCustomSizeHint(customSizeHints.value(name)); addDockWidget(sets[i].area, swatch); dockWidgetMenu->addMenu(swatch->menu); }}void MainWindow::setCorner(int id){ switch (id) { case 0: QMainWindow::setCorner(Qt::TopLeftCorner, Qt::TopDockWidgetArea); break; case 1: QMainWindow::setCorner(Qt::TopLeftCorner, Qt::LeftDockWidgetArea); break; case 2: QMainWindow::setCorner(Qt::TopRightCorner, Qt::TopDockWidgetArea); break; case 3: QMainWindow::setCorner(Qt::TopRightCorner, Qt::RightDockWidgetArea); break; case 4: QMainWindow::setCorner(Qt::BottomLeftCorner, Qt::BottomDockWidgetArea); break; case 5: QMainWindow::setCorner(Qt::BottomLeftCorner, Qt::LeftDockWidgetArea); break; case 6: QMainWindow::setCorner(Qt::BottomRightCorner, Qt::BottomDockWidgetArea); break; case 7: QMainWindow::setCorner(Qt::BottomRightCorner, Qt::RightDockWidgetArea); break; }}void MainWindow::switchLayoutDirection(){ if (layoutDirection() == Qt::LeftToRight) qApp->setLayoutDirection(Qt::RightToLeft); else qApp->setLayoutDirection(Qt::LeftToRight);}#include "mainwindow.moc"
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -