創(chuàng)建QWindow懂算,自帶菜單欄只冻,工具欄等

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ù)。

工具欄

如下如饵隙,上面是菜單欄撮珠,下面則是工具欄


image.png

一般地,一個(gè)程序中菜單欄唯一金矛,工具欄不唯一芯急,所以在QWindow中勺届,自帶成員函數(shù)addToolBar可自由添加工具欄

添加工具欄

QToolBar *toolBar=addToolBar("toolBar");

添加菜單項(xiàng)

    toolBar->addAction(pNew);

由此可以看出,工具欄和菜單項(xiàng)類(lèi)似娶耍,也可添加動(dòng)作


image.png

添加按鈕

    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ù)原


image.png

狀態(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)行效果如下


image.png

核心控件

核心控件為主要顯示的控件內(nèi)容紊婉,如添加一個(gè)文本編輯框可以使用如下代碼

    QTextEdit *textEdit=new QTextEdit(this);  //創(chuàng)建一個(gè)文本編輯框
    setCentralWidget(textEdit);//設(shè)置窗口的中心組建

如下圖,此時(shí)創(chuàng)建了一個(gè)文本編輯框


image.png

浮動(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)窗口可嵌入主窗口的上下左右


image.png

浮動(dòng)窗口還可分離為獨(dú)立窗口


image.png

對(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)閉");
    });
image.png

此時(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à)框


image.png

使用如下代碼分別查看各個(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é)果如下呐籽,


about

aboutQt

critical

infomation

question
warning

根據(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信息.


image.png

文件對(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)后苏章,效果如下


image.png

且控制臺(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)多行文本

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市丝格,隨后出現(xiàn)的幾起案子撑瞧,更是在濱河造成了極大的恐慌,老刑警劉巖显蝌,帶你破解...
    沈念sama閱讀 211,194評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件预伺,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡曼尊,警方通過(guò)查閱死者的電腦和手機(jī)酬诀,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,058評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)骆撇,“玉大人瞒御,你說(shuō)我怎么就攤上這事∩窠迹” “怎么了肴裙?”我有些...
    開(kāi)封第一講書(shū)人閱讀 156,780評(píng)論 0 346
  • 文/不壞的土叔 我叫張陵,是天一觀(guān)的道長(zhǎng)涌乳。 經(jīng)常有香客問(wèn)我蜻懦,道長(zhǎng),這世上最難降的妖魔是什么夕晓? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,388評(píng)論 1 283
  • 正文 為了忘掉前任宛乃,我火速辦了婚禮,結(jié)果婚禮上蒸辆,老公的妹妹穿的比我還像新娘征炼。我一直安慰自己,他們只是感情好躬贡,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,430評(píng)論 5 384
  • 文/花漫 我一把揭開(kāi)白布柒室。 她就那樣靜靜地躺著,像睡著了一般逗宜。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 49,764評(píng)論 1 290
  • 那天纺讲,我揣著相機(jī)與錄音擂仍,去河邊找鬼。 笑死熬甚,一個(gè)胖子當(dāng)著我的面吹牛逢渔,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播乡括,決...
    沈念sama閱讀 38,907評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼肃廓,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了诲泌?” 一聲冷哼從身側(cè)響起盲赊,我...
    開(kāi)封第一講書(shū)人閱讀 37,679評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎敷扫,沒(méi)想到半個(gè)月后哀蘑,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,122評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡葵第,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,459評(píng)論 2 325
  • 正文 我和宋清朗相戀三年绘迁,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片卒密。...
    茶點(diǎn)故事閱讀 38,605評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡缀台,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出哮奇,到底是詐尸還是另有隱情膛腐,我是刑警寧澤,帶...
    沈念sama閱讀 34,270評(píng)論 4 329
  • 正文 年R本政府宣布屏镊,位于F島的核電站依疼,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏而芥。R本人自食惡果不足惜律罢,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,867評(píng)論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望棍丐。 院中可真熱鬧误辑,春花似錦、人聲如沸歌逢。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,734評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)秘案。三九已至砰苍,卻和暖如春潦匈,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背赚导。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,961評(píng)論 1 265
  • 我被黑心中介騙來(lái)泰國(guó)打工茬缩, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人吼旧。 一個(gè)月前我還...
    沈念sama閱讀 46,297評(píng)論 2 360
  • 正文 我出身青樓凰锡,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親圈暗。 傳聞我的和親對(duì)象是個(gè)殘疾皇子掂为,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,472評(píng)論 2 348