Qt入門系列開發(fā)教程【基礎(chǔ)控件篇】QMainWindow主窗口

      網(wǎng)友投稿 1797 2025-03-31

      @[toc]


      描述

      主窗口為構(gòu)建應(yīng)用程序的用戶界面提供了一個(gè)框架。 Qt 有 QMainWindow 及其相關(guān)的主窗口管理類。 QMainWindow 有自己的布局,您可以在其中添加 QToolBars、QDockWidgets、QMenuBar 和 QStatusBar。 布局有一個(gè)中心區(qū)域,可以被任何類型的小部件占據(jù)。 您可以在下面看到布局的圖像。

      注意:不支持創(chuàng)建沒有中央小部件的主窗口。 即使它只是一個(gè)占位符,您也必須有一個(gè)中央小部件

      創(chuàng)建主窗口組件

      中央部件通常是標(biāo)準(zhǔn)的 Qt 部件,例如 QTextEdit 或 QGraphicsView。 自定義小部件也可用于高級(jí)應(yīng)用程序。 您可以使用 setCentralWidget() 設(shè)置中央小部件。

      主窗口具有單個(gè) (SDI) 或多個(gè) (MDI) 文檔界面。 您可以使用 QMdiArea 作為中央小部件在 Qt 中創(chuàng)建 MDI 應(yīng)用程序。

      我們現(xiàn)在將檢查可以添加到主窗口的每個(gè)其他小部件。 我們舉例說明如何創(chuàng)建和添加它們。

      void MainWindow::createMenus() { fileMenu = menuBar()->addMenu(tr("&File")); fileMenu->addAction(newAct); fileMenu->addAction(openAct); fileMenu->addAction(saveAct); }

      createPopupMenu() 函數(shù)在主窗口接收到上下文菜單事件時(shí)創(chuàng)建彈出菜單。 默認(rèn)實(shí)現(xiàn)會(huì)生成一個(gè)菜單,其中包含來自停靠小部件和工具欄的可檢查操作。 您可以為自定義菜單重新實(shí)現(xiàn) createPopupMenu()。

      創(chuàng)建工具欄

      工具欄在 QToolBar 類中實(shí)現(xiàn)。 使用 addToolBar() 將工具欄添加到主窗口。

      您可以通過將工具欄分配給特定的 Qt::ToolBarArea 來控制工具欄的初始位置。 您可以通過插入工具欄分隔符來分割區(qū)域 - 將其視為文本編輯中的換行符 - 使用 addToolBarBreak() 或 insertToolBarBreak()。 您還可以使用 QToolBar::setAllowedAreas() 和 QToolBar::setMovable() 限制用戶放置。

      可以使用 iconSize() 檢索工具欄圖標(biāo)的大小。 尺寸取決于平臺(tái); 您可以使用 setIconSize() 設(shè)置固定大小。 您可以使用 setToolButtonStyle() 更改工具欄中所有工具按鈕的外觀。

      Qt入門系列開發(fā)教程【基礎(chǔ)控件篇】QMainWindow主窗口

      工具欄創(chuàng)建示例如下:

      void MainWindow::createToolBars() { fileToolBar = addToolBar(tr("File")); fileToolBar->addAction(newAct); }

      創(chuàng)建 Dock 小部件

      Dock 小部件在 QDockWidget 類中實(shí)現(xiàn)。 停靠小部件是可以停靠在主窗口中的窗口。 您可以使用 addDockWidget() 將停靠小部件添加到主窗口。

      Qt::DockWidgetArea 枚舉給出了四個(gè)停靠小部件區(qū)域:左、右、上和下。 您可以使用 setCorner() 指定哪個(gè)停靠小部件區(qū)域應(yīng)占據(jù)區(qū)域重疊的角落。 默認(rèn)情況下,每個(gè)區(qū)域只能包含一行(垂直或水平)停靠小部件,但如果您使用 setDockNestingEnabled() 啟用嵌套,則可以在任一方向添加停靠小部件。

      兩個(gè)停靠小部件也可以相互堆疊。 然后使用 QTabBar 選擇應(yīng)該顯示哪些小部件。

      我們舉例說明如何創(chuàng)建停靠小部件并將其添加到主窗口:

      QDockWidget *dockWidget = new QDockWidget(tr("Dock Widget"), this); dockWidget->setAllowedAreas(Qt::LeftDockWidgetArea | Qt::RightDockWidgetArea); dockWidget->setWidget(dockWidgetContents); addDockWidget(Qt::LeftDockWidgetArea, dockWidget);

      狀態(tài)欄

      您可以使用 setStatusBar() 設(shè)置狀態(tài)欄,但在第一次調(diào)用 statusBar()(返回主窗口的狀態(tài)欄)時(shí)會(huì)創(chuàng)建一個(gè)狀態(tài)欄。 有關(guān)如何使用它的信息,請(qǐng)參閱 QStatusBar。

      存儲(chǔ)狀態(tài)

      QMainWindow 可以使用 saveState() 存儲(chǔ)其布局的狀態(tài); 稍后可以使用 restoreState() 檢索它。 它是存儲(chǔ)的工具欄和停靠小部件的位置和大小(相對(duì)于主窗口的大小)。

      API

      #ifndef QDYNAMICMAINWINDOW_H #define QDYNAMICMAINWINDOW_H #include #include #if QT_CONFIG(tabwidget) #include #endif QT_REQUIRE_CONFIG(mainwindow); QT_BEGIN_NAMESPACE class QDockWidget; class QMainWindowPrivate; class QMenuBar; class QStatusBar; class QToolBar; class QMenu; class Q_WIDGETS_EXPORT QMainWindow : public QWidget { Q_OBJECT Q_PROPERTY(QSize iconSize READ iconSize WRITE setIconSize) Q_PROPERTY(Qt::ToolButtonStyle toolButtonStyle READ toolButtonStyle WRITE setToolButtonStyle) #if QT_CONFIG(dockwidget) Q_PROPERTY(bool animated READ isAnimated WRITE setAnimated) #if QT_CONFIG(tabbar) Q_PROPERTY(bool documentMode READ documentMode WRITE setDocumentMode) #endif // QT_CONFIG(tabbar) #if QT_CONFIG(tabwidget) Q_PROPERTY(QTabWidget::TabShape tabShape READ tabShape WRITE setTabShape) #endif // QT_CONFIG(tabwidget) Q_PROPERTY(bool dockNestingEnabled READ isDockNestingEnabled WRITE setDockNestingEnabled) #endif // QT_CONFIG(dockwidget) Q_PROPERTY(DockOptions dockOptions READ dockOptions WRITE setDockOptions) #if QT_CONFIG(toolbar) Q_PROPERTY(bool unifiedTitleAndToolBarOnMac READ unifiedTitleAndToolBarOnMac WRITE setUnifiedTitleAndToolBarOnMac) #endif public: enum DockOption { AnimatedDocks = 0x01, AllowNestedDocks = 0x02, AllowTabbedDocks = 0x04, ForceTabbedDocks = 0x08, // implies AllowTabbedDocks, !AllowNestedDocks VerticalTabs = 0x10, // implies AllowTabbedDocks GroupedDragging = 0x20 // implies AllowTabbedDocks }; Q_ENUM(DockOption) Q_DECLARE_FLAGS(DockOptions, DockOption) Q_FLAG(DockOptions) //構(gòu)造函數(shù) explicit QMainWindow(QWidget *parent = nullptr, Qt::WindowFlags flags = Qt::WindowFlags()); //析構(gòu)函數(shù) ~QMainWindow(); //工具類icon大小 QSize iconSize() const; void setIconSize(const QSize &iconSize); //工具欄按鈕樣式 Qt::ToolButtonStyle toolButtonStyle() const; void setToolButtonStyle(Qt::ToolButtonStyle toolButtonStyle); #if QT_CONFIG(dockwidget) bool isAnimated() const; bool isDockNestingEnabled() const; #endif #if QT_CONFIG(tabbar) bool documentMode() const; void setDocumentMode(bool enabled); #endif #if QT_CONFIG(tabwidget) QTabWidget::TabShape tabShape() const; void setTabShape(QTabWidget::TabShape tabShape); QTabWidget::TabPosition tabPosition(Qt::DockWidgetArea area) const; void setTabPosition(Qt::DockWidgetAreas areas, QTabWidget::TabPosition tabPosition); #endif // QT_CONFIG(tabwidget) //設(shè)置dock配置 void setDockOptions(DockOptions options); DockOptions dockOptions() const; bool isSeparator(const QPoint &pos) const; //菜單欄相關(guān) #if QT_CONFIG(menubar) QMenuBar *menuBar() const; void setMenuBar(QMenuBar *menubar); QWidget *menuWidget() const; void setMenuWidget(QWidget *menubar); #endif #if QT_CONFIG(statusbar) QStatusBar *statusBar() const; void setStatusBar(QStatusBar *statusbar); #endif //獲取中心部件 QWidget *centralWidget() const; void setCentralWidget(QWidget *widget); //刪除中心部件 QWidget *takeCentralWidget(); #if QT_CONFIG(dockwidget) void setCorner(Qt::Corner corner, Qt::DockWidgetArea area); Qt::DockWidgetArea corner(Qt::Corner corner) const; #endif //工具欄相關(guān) #if QT_CONFIG(toolbar) void addToolBarBreak(Qt::ToolBarArea area = Qt::TopToolBarArea); void insertToolBarBreak(QToolBar *before); void addToolBar(Qt::ToolBarArea area, QToolBar *toolbar); void addToolBar(QToolBar *toolbar); QToolBar *addToolBar(const QString &title); void insertToolBar(QToolBar *before, QToolBar *toolbar); void removeToolBar(QToolBar *toolbar); void removeToolBarBreak(QToolBar *before); bool unifiedTitleAndToolBarOnMac() const; Qt::ToolBarArea toolBarArea(const QToolBar *toolbar) const; bool toolBarBreak(QToolBar *toolbar) const; #endif // QT_CONFIG(toolbar) #if QT_CONFIG(dockwidget) //添加dock void addDockWidget(Qt::DockWidgetArea area, QDockWidget *dockwidget); void addDockWidget(Qt::DockWidgetArea area, QDockWidget *dockwidget, Qt::Orientation orientation); //將第一個(gè)停靠小部件覆蓋的空間分成兩部分,將第一個(gè)停靠小部件移動(dòng)到第一部分,并將第二個(gè)停靠小部件移動(dòng)到第二部分。 void splitDockWidget(QDockWidget *after, QDockWidget *dockwidget, Qt::Orientation orientation); #if QT_CONFIG(tabbar) void tabifyDockWidget(QDockWidget *first, QDockWidget *second); QList tabifiedDockWidgets(QDockWidget *dockwidget) const; #endif //刪除dock void removeDockWidget(QDockWidget *dockwidget); //恢復(fù)dock bool restoreDockWidget(QDockWidget *dockwidget); Qt::DockWidgetArea dockWidgetArea(QDockWidget *dockwidget) const; void resizeDocks(const QList &docks, const QList &sizes, Qt::Orientation orientation); #endif // QT_CONFIG(dockwidget) QByteArray saveState(int version = 0) const; bool restoreState(const QByteArray &state, int version = 0); #if QT_CONFIG(menu) virtual QMenu *createPopupMenu(); #endif public Q_SLOTS: #if QT_CONFIG(dockwidget) void setAnimated(bool enabled); void setDockNestingEnabled(bool enabled); #endif #if QT_CONFIG(toolbar) void setUnifiedTitleAndToolBarOnMac(bool set); #endif Q_SIGNALS: void iconSizeChanged(const QSize &iconSize); void toolButtonStyleChanged(Qt::ToolButtonStyle toolButtonStyle); #if QT_CONFIG(dockwidget) void tabifiedDockWidgetActivated(QDockWidget *dockWidget); #endif protected: #ifndef QT_NO_CONTEXTMENU void contextMenuEvent(QContextMenuEvent *event) override; #endif //事件函數(shù) bool event(QEvent *event) override; private: Q_DECLARE_PRIVATE(QMainWindow) Q_DISABLE_COPY(QMainWindow) }; Q_DECLARE_OPERATORS_FOR_FLAGS(QMainWindow::DockOptions) QT_END_NAMESPACE #endif // QDYNAMICMAINWINDOW_H

      Qt

      版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實(shí)的內(nèi)容,請(qǐng)聯(lián)系我們jiasou666@gmail.com 處理,核實(shí)后本網(wǎng)站將在24小時(shí)內(nèi)刪除侵權(quán)內(nèi)容。

      版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實(shí)的內(nèi)容,請(qǐng)聯(lián)系我們jiasou666@gmail.com 處理,核實(shí)后本網(wǎng)站將在24小時(shí)內(nèi)刪除侵權(quán)內(nèi)容。

      上一篇:WPS表格辦公—-給員工統(tǒng)一工號(hào)的方法(wps表格工作簿統(tǒng)一格式)
      下一篇:制造業(yè)生產(chǎn)管理分析表模板(制造年度總結(jié)報(bào)告)
      相關(guān)文章
      亚洲视频在线一区二区三区| 亚洲av无码不卡一区二区三区| 亚洲制服中文字幕第一区| 亚洲免费综合色在线视频| 亚洲AV成人噜噜无码网站| 亚洲熟妇无码爱v在线观看| 亚洲日本一区二区三区在线| 国产亚洲av片在线观看18女人 | 亚洲精品在线不卡| 亚洲高清免费在线观看| 亚洲欧洲日产国码无码久久99| 亚洲精品和日本精品| 国产精品亚洲高清一区二区| 亚洲一区精品伊人久久伊人| 在线观看亚洲av每日更新| 亚洲精品美女久久久久99| 亚洲国产精品一区二区第一页 | 亚洲欧美熟妇综合久久久久| 亚洲精品中文字幕无码A片老| 亚洲精品天堂无码中文字幕| 无码亚洲成a人在线观看| 国产精品久久亚洲一区二区| 亚洲精品国产精品国自产观看| 亚洲欧洲中文日韩av乱码| 亚洲中文字幕无码久久2017| 亚洲处破女AV日韩精品| 亚洲好看的理论片电影| 亚洲成在人线电影天堂色| 7777久久亚洲中文字幕| 亚洲AV无码成人网站在线观看| 一级毛片直播亚洲| 亚洲综合色视频在线观看| 亚洲妇熟XXXX妇色黄| 亚洲黄色免费在线观看| 国产v亚洲v天堂a无| MM1313亚洲国产精品| 亚洲自偷自偷图片| 亚洲精品在线观看视频| 亚洲三级视频在线| 青青青亚洲精品国产| 一本色道久久综合亚洲精品|