主窗口 mainWindow
前面學習的所有代碼,都是基于QWidget
控件,其更多的是作為別的窗口的部分
現在來學習QMainWindow
,即主窗口,其包含以下屬性
Window Title
:標題欄Menu Bar
:菜單欄Tool Bar Area
:工具欄Dock Widget Area
:鉚接部件(子窗口)Central Widget
:中央窗口Status Bar
:狀態欄
菜單欄 Menu Bar
一個窗口,只能有一個菜單欄,但是可以有很多個菜單,每一個菜單又可以很多菜單項
例如,用代碼創建菜單欄、菜單、菜單項、子菜單、分割線、圖標:
MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);// 獲取菜單欄QMenuBar* menuBar = this->menuBar();// 創建菜單,并設置快捷鍵QMenu* menu1 = new QMenu("文件 (&F)");QMenu* menu2 = new QMenu("設置 (&S)");QMenu* menu3 = new QMenu("關于 (&A)");menuBar->addMenu(menu1);menuBar->addMenu(menu2);menuBar->addMenu(menu3);// 創建菜單項QAction* act1 = new QAction("新建");QAction* act2 = new QAction("保存");QAction* act3 = new QAction("退出");menu1->addAction(act1);menu1->addSeparator(); // 添加分割線menu1->addAction(act2);menu1->addSeparator(); // 添加分割線menu1->addAction(act3);// 為菜單項添加圖片act1->setIcon(QIcon(":/open"));act2->setIcon(QIcon(":/save"));// 為菜單添加圖片menu1->setIcon(QIcon(":/file"));// 設置菜單項快捷鍵act1->setShortcut(QKeySequence(Qt::CTRL | Qt::Key_N));act2->setShortcut(QKeySequence(Qt::CTRL | Qt::Key_B));act3->setShortcut(QKeySequence(Qt::CTRL | Qt::Key_E));// 創建子菜單QMenu* menu_child = new QMenu("高級 (&L)");QAction* act4 = new QAction("字體");QAction* act5 = new QAction("語言");menu_child->addAction(act4);menu1->addSeparator(); // 添加分割線menu_child->addAction(act5);// 將子菜單添加到菜單 menu2menu2->addMenu(menu_child);connect(act1, &QAction::triggered, this, [](){qDebug() << "新建文件";});connect(act2, &QAction::triggered, this, [](){qDebug() << "保存文件";});connect(act3, &QAction::triggered, this, [](){qDebug() << "退出窗口";});connect(act3, &QAction::triggered, this, &QMainWindow::close);
}
QAction::triggered
:該信號為菜單項被用戶執行時觸發- 可以通過
& + 按鍵
的方式,設置菜單的快捷鍵,此時,按下Alt + 按鍵
即可打開對應的菜單 - 盡管也可以通過
& + 按鍵
的方式,設置菜單項的快捷鍵,但是如果要使用,就必須先展開對應的菜單。 因此對于**QAction
快捷鍵的設置,優先使用setShortcut
** - 如果為菜單設置圖片,那么菜單的文本就不會顯示;如果為菜單項設置圖片,菜單項的圖片和文本都可以顯示
效果:
工具欄 Tool Bar
一個窗口,可以沒有工具欄,可以有工具欄,也可以有多個
一個窗口,默認不自帶工具欄,需要手動創建
例如:
MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);// 創建工具欄QToolBar* toolBar = new QToolBar();this->addToolBar(toolBar);// 創建工具項QAction* act1 = new QAction("打開文件");QAction* act2 = new QAction("保存文件");act1->setIcon(QIcon(":/open"));act2->setIcon(QIcon(":/save"));// 將工具項 添加到 工具欄toolBar->addAction(act1);toolBar->addAction(act2);connect(act1, &QAction::triggered, this, [](){qDebug() << "打開文件";});connect(act2, &QAction::triggered, this, [](){qDebug() << "保存文件";});
}
-
如果工具項被設置了圖標,那么其文本就會被隱藏
-
被隱藏的文本會以
toolTip
的方式存在 -
工具欄和菜單欄往往搭配使用,工具欄中的工具項也可以在菜單欄中出現
-
工具欄可以被拖動,我們可以對其相關屬性進行設置:
-
可以設置工具欄出現的初始位置。可以在
addToolBar
中添加選項來設置Qt::LeftToolBarArea
停靠在左側Qt::RightToolBarArea
停靠在右側Qt::TopToolBarArea
停靠在頂部Qt::BottomToolBarArea
停靠在底部Qt::AllToolBarAreas
以上四個位置都可停靠
-
可以設置工具欄允許停靠在哪些邊緣
- 通過函數設置:
setAllowedAreas()
- 通過函數設置:
-
可以設置工具欄是否允許浮動
- 通過函數設置:
setFloatable()
- 通過函數設置:
-
可以設置工具欄是否可以移動
- 通過函數設置:
setMovable()
- 通過函數設置:
-
效果:
狀態欄 Status Bar
QMainWindow
自帶狀態欄Status Bar
,且一個窗口狀態欄只存在一個
例如:
MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);// 獲取狀態欄QStatusBar* statusBar = this->statusBar();// 添加臨時控件QLabel* label = new QLabel("這是一條臨時消息");statusBar->addWidget(label, 1);// 添加永久控件QProgressBar* progress = new QProgressBar();progress->setTextVisible(true);progress->setRange(0, 100);progress->setValue(40);statusBar->addPermanentWidget(progress, 2);// 線是一條信息statusBar->showMessage("這是一條顯示信息", 3000);
}
addWidget
:向狀態欄添加一個臨時控件,這個控件可以被showMessage()
顯示的信息覆蓋。后面的數字為拉伸系數addPermanentWidget
:向狀態欄添加一個永久控件,這個控件不可以被showMessage()
顯示的信息覆蓋。后面的數字為拉伸系數showMessage
:在狀態欄顯示一條消息,后面的數字為顯示時間(ms),默認為0,0為永久顯示
浮動窗口 Dock Widget
可以像正常窗口一樣,給浮動窗口內部,添加一些其他控件
但是不能直接給這個浮動窗口添加子控件,而是需要創建出一個單獨的QWidget
,將控件添加到QWidget
中
最后再將QWidget
添加到子窗口中
例如:
MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);// 創建子窗口,并放置在主窗口頂部QDockWidget* dock = new QDockWidget("子窗口");// 只允許停靠在頂部和右側dock->setAllowedAreas(Qt::DockWidgetArea::RightDockWidgetArea | Qt::DockWidgetArea::TopDockWidgetArea);this->addDockWidget(Qt::DockWidgetArea::TopDockWidgetArea, dock);// 添加一個容器窗口QWidget* container = new QWidget();QVBoxLayout* layout = new QVBoxLayout();container->setLayout(layout);QLabel* label = new QLabel("這是一段文本");layout->addWidget(label);// 將容器窗口添加到子窗口中dock->setWidget(container);
}
效果: