QWindow實(shí)際上是在QWidget基礎(chǔ)上派生出,自帶了菜單欄计技,工具欄喜德,狀態(tài)欄等等的一個(gè)復(fù)雜的QWidget
創(chuàng)建項(xiàng)目
首先,創(chuàng)建項(xiàng)目時(shí)垮媒,從原來(lái)的QWidget變更為QMainWindow
菜單欄
獲取菜單欄
QMainWindow自帶一個(gè)菜單欄舍悯,通過(guò)其成員函數(shù)menuBar()可獲得到菜單欄的對(duì)象指針。
菜單欄的類(lèi)為QMenuBar睡雇,需要在開(kāi)頭include它萌衬,然后在MainWindow構(gòu)造函數(shù)里寫(xiě)
QMenuBar *mBar=menuBar();
添加菜單
QMenuBar菜單欄中可以添加菜單,使用QmenuBar對(duì)象中的addMenu成員函數(shù)入桂,它返回一個(gè)QMenu對(duì)象指針奄薇。
QMenu *pFile=mBar->addMenu("文件");
添加菜單項(xiàng)
QMenu菜單中可以添加菜單項(xiàng),使用QMenu對(duì)象中的addAction成員函數(shù)抗愁,它返回一個(gè)QAction對(duì)象指針
QAction *pNew=pFile->addAction("新建");
添加菜單項(xiàng)的觸發(fā)事件
connect(pNew,&QAction::triggered,[=](){
qDebug("新建被按下");
});
注意lambda表達(dá)式需要在配置文件中寫(xiě)入CONFIG += C++11
運(yùn)行結(jié)果:
當(dāng)我們按下新建時(shí)呵晚,將觸發(fā)控制臺(tái)輸出代碼如下蜘腌,
添加分割線(xiàn)
pFile->addSeparator();//添加分割線(xiàn)
更簡(jiǎn)單的菜單項(xiàng)添加
connect(pFile->addAction("打開(kāi)"),&QAction::triggered,[=](){
dDebug("打開(kāi)被按下");
});
上述代碼可一步添加菜單項(xiàng)并綁定信號(hào)和槽函數(shù)。
工具欄
如下如饵隙,上面是菜單欄撮珠,下面則是工具欄
一般地,一個(gè)程序中菜單欄唯一金矛,工具欄不唯一芯急,所以在QWindow中勺届,自帶成員函數(shù)addToolBar可自由添加工具欄
添加工具欄
QToolBar *toolBar=addToolBar("toolBar");
添加菜單項(xiàng)
toolBar->addAction(pNew);
由此可以看出,工具欄和菜單項(xiàng)類(lèi)似娶耍,也可添加動(dòng)作
添加按鈕
QPushButton *b=new QPushButton(this);
b->setText("^_^");
toolBar->addWidget(b);
connect(b,&QPushButton::pressed,[=](){
b->setText("2333");
});
connect(b,&QPushButton::released,[=](){
b->setText("^_^");
});
效果如下圖免姿,當(dāng)按下按鈕時(shí),按鈕文字便為2333榕酒,松手時(shí)復(fù)原
狀態(tài)欄
如圖胚膊,狀態(tài)欄(QStatusBar)一般是程序窗口最下方的一欄,在QWindow中想鹰,通過(guò)其成員函數(shù)statusBar()獲得到
獲取狀態(tài)欄
QStatusBar *sBar=statusBar();
添加控件
QStatusBar *sBar=statusBar();
QLabel *label=new QLabel(this);
label->setText("這是狀態(tài)欄上的第一個(gè)標(biāo)簽 ");
//addWidget從左往右添加控件
sBar->addWidget(label);
sBar->addWidget(new QLabel("第二個(gè)標(biāo)簽",this));
//addPermanentWidget從右往左添加控件
sBar->addPermanentWidget(new QLabel("第三個(gè)",this));
運(yùn)行效果如下
核心控件
核心控件為主要顯示的控件內(nèi)容紊婉,如添加一個(gè)文本編輯框可以使用如下代碼
QTextEdit *textEdit=new QTextEdit(this); //創(chuàng)建一個(gè)文本編輯框
setCentralWidget(textEdit);//設(shè)置窗口的中心組建
如下圖,此時(shí)創(chuàng)建了一個(gè)文本編輯框
浮動(dòng)窗口
//一個(gè)浮動(dòng)窗口
QDockWidget *dock=new QDockWidget(this);
//添加這個(gè)浮動(dòng)窗口
addDockWidget(Qt::RightDockWidgetArea,dock);
//向浮動(dòng)窗口再添加一個(gè)文本框
QTextEdit *textEdit1=new QTextEdit(this);
dock->setWidget(textEdit1);
如下下圖辑舷,浮動(dòng)窗口可嵌入主窗口的上下左右
浮動(dòng)窗口還可分離為獨(dú)立窗口
對(duì)話(huà)框(QDialog)
對(duì)話(huà)框有模態(tài)對(duì)話(huà)框和非模態(tài)對(duì)話(huà)框之分喻犁,
模態(tài)對(duì)話(huà)框在顯示時(shí),其父窗口無(wú)法進(jìn)行任何操作
非模態(tài)對(duì)話(huà)框顯示時(shí)何缓,其父窗口仍可進(jìn)行操作
模態(tài)對(duì)話(huà)框
如下代碼可添加一個(gè)模態(tài)對(duì)話(huà)框肢础,
QMenu *pDialogMenu=mBar->addMenu("對(duì)話(huà)框");
connect(pDialogMenu->addAction("模態(tài)對(duì)話(huà)框"),&QAction::triggered,[=](){
qDebug("模態(tài)對(duì)話(huà)框打開(kāi)");
QDialog dig;
dig.exec();
qDebug("模態(tài)對(duì)話(huà)框關(guān)閉");
});
此時(shí),我們無(wú)法操作主窗口
非模態(tài)對(duì)話(huà)框
對(duì)于非模態(tài)對(duì)話(huà)框歌殃,直接調(diào)用其show()函數(shù)便可以顯示一個(gè)獨(dú)立的對(duì)話(huà)框了乔妈,但是如果我們把上述代碼的exec改成show,我們發(fā)現(xiàn)對(duì)話(huà)框根本就沒(méi)有彈出氓皱,這是因?yàn)閘ambda表達(dá)式在執(zhí)行完畢后路召,自動(dòng)將表達(dá)式內(nèi)的所有變量自動(dòng)回收,即生命周期結(jié)束波材。
一種方法是把對(duì)話(huà)框定義在lambda表達(dá)式之外股淡,
還有一種方法是把對(duì)話(huà)框使用指針和new來(lái)動(dòng)態(tài)分配空間定義。
如下代碼廷区,動(dòng)態(tài)定義了一個(gè)非模態(tài)對(duì)話(huà)框并顯示唯灵。
connect(pDialogMenu->addAction("非模態(tài)對(duì)話(huà)框"),&QAction::triggered,[=](){
qDebug("非模態(tài)對(duì)話(huà)框");
QDialog *dig=new QDialog();
dig->show();
qDebug("模態(tài)對(duì)話(huà)框已顯示");
});
上述代碼運(yùn)行可發(fā)現(xiàn),點(diǎn)擊非模態(tài)對(duì)話(huà)框后隙轻,控制臺(tái)將直接輸出
非模態(tài)對(duì)話(huà)框
模態(tài)對(duì)話(huà)框已顯示
由此可知埠帕,show方法不會(huì)阻塞,而exec方法會(huì)阻塞
如果使用動(dòng)態(tài)內(nèi)存分配的對(duì)話(huà)框玖绿,關(guān)閉時(shí)并不會(huì)內(nèi)存回收敛瓷,我們需要做標(biāo)記如下,當(dāng)對(duì)話(huà)框關(guān)閉時(shí)斑匪,自動(dòng)delete對(duì)話(huà)框?qū)ο?
dig->setAttribute(Qt::WA_DeleteOnClose);
標(biāo)準(zhǔn)對(duì)話(huà)框
Qt中自帶了以下幾種標(biāo)準(zhǔn)對(duì)話(huà)框
使用如下代碼分別查看各個(gè)對(duì)話(huà)框的樣式
QMenu *pHelpMenu=mBar->addMenu("幫助");
connect(pHelpMenu->addAction("about"),&QAction::triggered,[=](){
QMessageBox::about(this,"about","OK");
});
connect(pHelpMenu->addAction("aboutQt"),&QAction::triggered,[=](){
QMessageBox::aboutQt(this,"aboutQt");
});
connect(pHelpMenu->addAction("critical"),&QAction::triggered,[=](){
QMessageBox::critical(this,"critical","This is a critical");
});
connect(pHelpMenu->addAction("information"),&QAction::triggered,[=](){
QMessageBox::information(this,"information","This is an information");
});
connect(pHelpMenu->addAction("question"),&QAction::triggered,[=](){
QMessageBox::question(this,"question","This is a question");
});
connect(pHelpMenu->addAction("warning"),&QAction::triggered,[=](){
QMessageBox::warning(this,"warning","This is a warning");
});
運(yùn)行結(jié)果如下呐籽,
根據(jù)第一幅圖中的說(shuō)明定義,可看出除了about開(kāi)頭的方法外,其余方法調(diào)用后均返回一個(gè)StandardButton狡蝶,我們可以根據(jù)返回值判斷用戶(hù)點(diǎn)擊的按鈕
如下圖為問(wèn)題對(duì)話(huà)框(question)中的選擇分支代碼庶橱,
connect(pHelpMenu->addAction("question"),&QAction::triggered,[=](){
int select=QMessageBox::question(this,"question","This is a question");
switch(select){
case QMessageBox::Yes:
qDebug("Yes");
break;
case QMessageBox::No:
qDebug("No");
break;
default:
break;
}
});
如下圖,此時(shí)我們點(diǎn)擊兩個(gè)按鈕贪惹,可相應(yīng)打印debug信息.
文件對(duì)話(huà)框
QFileDialog::getOpenFileName函數(shù)可打開(kāi)一個(gè)文件對(duì)話(huà)框
參數(shù)分別為:
- 父控件對(duì)象指針
- 對(duì)話(huà)框標(biāo)題
- 初始文件路徑
- 文件類(lèi)型
connect(pDialogMenu->addAction("文件對(duì)話(huà)框"),&QAction::triggered,[=](){
qDebug("文件對(duì)話(huà)框打開(kāi)");
QString path=QFileDialog::getOpenFileName(this,"open","../",
"Images (*.png *.xpm *.jpg);;"
"Text files (*.txt);;"
"XML files (*.xml)");
qDebug("選中路徑:");
qDebug()<<path;
qDebug("文件對(duì)話(huà)框關(guān)閉");
});
對(duì)話(huà)框啟動(dòng)后苏章,效果如下
且控制臺(tái)輸出如下:
文件對(duì)話(huà)框打開(kāi)
選中路徑:
"D:/qt-workspace/Example/ExampleFile.xml"
文件對(duì)話(huà)框關(guān)閉
注意:
如上代碼,QFileDialog::getOpenFileName函數(shù)中的第四個(gè)參數(shù)馍乙,為文件類(lèi)型過(guò)濾器布近,可以使用C++的一個(gè)語(yǔ)法糖自動(dòng)拼接字符串實(shí)現(xiàn)多行文本