QT常用控制項(一)——菜單欄和對話框
引言
QMainWindow 是一個為用戶提供主窗口程式的類,包含一個菜單欄(menu bar)、多個工具欄(tool bars)、多個錨接部件(dock widgets)、一個狀態欄(status bar)及一個中心部件(central widget),是許多應用程式的基礎,如文本編輯器,圖片編輯器等。(本篇主要介紹菜單欄和工具欄)

一,菜單欄
- 創建菜單欄。
QMenuBar* menuBar = new QMenuBar(this);
-
創建菜單,調用 QMenu 的成員函數 addMenu 來添加菜單
QAction* addMenu(QMenu * menu)
QMenu* addMenu(const QString & title)
QMenu* addMenu(const QIcon & icon, const QString & title)
- 創建菜單項,調用 QMenu 的成員函數 addAction 來添加菜單項
QAction* activeAction()
QAction* addAction(const QString & text)
QAction* addAction(const QIcon & icon, const QString & text)
QAction* addAction(const QString & text, const QObject * receiver, const char * member, const QKeySequence & shortcut = 0)
QAction* addAction(const QIcon & icon, const QString & text, const QObject * receiver, const char * member,const QKeySequence & shortcut = 0)
實例演示:(vs2019+qt5)
//創建菜單欄 QMenuBar* menuBar = new QMenuBar(this); //創建菜單(用addMenu方法添加入菜單欄) QMenu* filename = menuBar->addMenu(QStringLiteral("文件(&F)")); //創建菜單項 QAction* openfile = new QAction(QStringLiteral("打開文件(&O)")); QAction* opendlg = new QAction(QStringLiteral("打開對話框(&D)")); //給菜單項添入圖標 openfile->setIcon(QIcon(":/D:/image/Luffy.png")); opendlg->setIcon(QIcon(":/D:/image/LuffyQ.png")); //用addAction加入菜單項 filename->addAction(opendlg); filename->addAction(openfile);
注意:使用 QStringLiteral 宏可以在編譯期把程式碼里的常量字元串 str 直接構造為 QString 對象,於是運行時就不再需要額外的構造開銷了。
資源文件的添加
openfile->setIcon(QIcon(":/D:/image/Luffy.png"));
對於該句程式碼":/D:/image/Luffy.png"是以相對路徑添加的(即以:/開頭的是資源文件),那麼如何添加資源文件呢?
- 添加->新建項->Qt->Qt Resource File。
- 在Resource1.qrc中添加說需要的資源(比如圖片)
最後以冒號+前綴+名稱(相對路徑)寫入資源。
二,工具欄
-
直接調用 QMainWindow 類的 addToolBar()函數獲取主窗口的工具條對象,每增加一個工具條都需要調用一次該函數
-
插入屬於工具條的動作,即在工具條上添加操作。通過 QToolBar 類的 addAction 函數添加
-
工具條是一個可移動的窗口,它的停靠區域由 QToolBar 的 allowAreas 決定,包括:
- Qt::LeftToolBarArea 停靠在左側
- Qt::RightToolBarArea停靠在右側
- Qt::TopToolBarArea 停靠在頂部
- Qt::BottomToolBarArea停靠在底部
- Qt::AllToolBarAreas以上四個位置都可停靠
使用 setAllowedAreas()函數指定停靠區域:
setAllowedAreas(Qt::LeftToolBarArea | Qt::RightToolBarArea)
setMoveable(false)//工具條不可移動, 只能停靠在初始化的位置上
三,對話框 QDialog
- 模態對話框,就是會阻塞同一應用程式中其它窗口的輸入。模態對話框很常見,比如「打開文件」功能。你可以嘗試一下記事本的打開文件,當打開文件對話框出現時,我們是不能對除此對話框之外的窗口部分進行操作的。
- 與此相反的是非模態對話框,例如查找對話框,我們可以在顯示著查找對話框的同時,繼續對記事本的內容進行編輯。
- 使用 QDialog::exec()實現應用程式級別的模態對話框
- 使用 QDialog::open()實現窗口級別的模態對話框
- 使用 QDialog::show()實現非模態對話框。
模態對話框實例:
QDialog dlg1(this); dlg1.resize(300,200); dlg1.setWindowTitle(QStringLiteral("模態對話框")); dlg1.exec();
非模態對話框實例:
QDialog dlg1(this); dlg1.resize(300,200); dlg1.setWindowTitle(QStringLiteral("模態對話框")); dlg1.show();
QDialog *dlg2 = new QDialog(); dlg2->resize(200, 200); dlg2->setAttribute(Qt::WA_DeleteOnClose);//關閉時清理記憶體 dlg2->show();
注意:在堆上就不能用點(.)了,要用->。而且由於使用 new 在堆上分配空間,卻一直沒有 delete。因此我們用setAttribute()函數設置對話框關閉時,自動銷毀對話框。
2️⃣標準文件對話框
QString getOpenFileName(QWidget * parent = 0, //父窗口 const QString & caption = QString(), //對話框標題 const QString & dir = QString(), //對話框打開的默認路徑 const QString & filter = QString(), //過濾器(例如我們使用「imagefile(*.jpg*.png)」則只顯示jpg和png文件。多個過濾器用「;;」分割。 QString * selectedFilter = 0, //默認選擇的過濾器 Options options = 0 //對話框的參數設定 )
//打開文件 void MainWindow::openFile() { QString path = QFileDialog::getOpenFileName(this, tr("Open File"), ".", tr("Text Files(*.txt)")); if(!path.isEmpty()) { QFile file(path); if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) { QMessageBox::warning(this, tr("Read File"), tr("Cannot open file:\n%1").arg(path)); return; } QTextStream in(&file); textEdit->setText(in.readAll()); file.close(); } else { QMessageBox::warning(this, tr("Path"), tr("You did not select any file.")); } }
//保存文件 void MainWindow::saveFile() { QString path = QFileDialog::getSaveFileName(this, tr("Open File"), ".", tr("Text Files(*.txt)")); if(!path.isEmpty()) { QFile file(path); if (!file.open(QIODevice::WriteOnly | QIODevice::Text)) { QMessageBox::warning(this, tr("Write File"), tr("Cannot open file:\n%1").arg(path)); return; } QTextStream out(&file); out << textEdit->toPlainText(); file.close(); } else { QMessageBox::warning(this, tr("Path"), tr("You did not select any file.")); } }
實例演示:創建菜單欄,菜單項為打開文件夾和對話框。點擊打開對應功能。
//菜單文件 // 使用 QStringLiteral 宏可以在編譯期把程式碼里的常量字元串 str 直接構造為 QString 對象,於是運行時就不再需要額外的構造開銷了。 QMenuBar* menuBar = new QMenuBar(this); QMenu* filename = menuBar->addMenu(QStringLiteral("文件(&F)")); QAction* openfile = new QAction(QStringLiteral("打開文件(&O)")); QAction* opendlg = new QAction(QStringLiteral("打開對話框(&D)")); openfile->setIcon(QIcon(":/D:/image/Luffy.png")); opendlg->setIcon(QIcon(":/D:/image/LuffyQ.png")); filename->addAction(opendlg); filename->addAction(openfile); //打開對話框 connect(opendlg, &QAction::triggered, [=]() { //模態對話框(不可對其他對話框操作) QDialog dlg1(this); dlg1.resize(300,200); dlg1.setWindowTitle(QStringLiteral("模態對話框")); dlg1.exec(); //非模態對話框(可以對其他對話框操作) // QDialog *dlg2 = new QDialog(); //dlg2->resize(200, 200); //dlg2->setAttribute(Qt::WA_DeleteOnClose);//關閉時清理記憶體 //dlg2->show(); });
//打開文件夾 connect(openfile, &QAction::triggered, [=]() { QFileDialog fdlg(this); fdlg.getOpenFileName(this, QStringLiteral("選擇文件"), "D:\\", tr("Image(*.jpg*.png)")); });