1. 程式人生 > >2015.6.5 qt學習筆記 accept()概念

2015.6.5 qt學習筆記 accept()概念

本篇,會重點講述模式對話方塊,以及exec()的用法,accept()和accepted的概念。

一.非模式對話方塊

非模式對話方塊是和同一個程式中其它視窗操作無關的對話方塊。在字處理軟體中查詢和替換對話方塊通常是非模式的來允許同時與應用程式主視窗和對話方塊進行互動。呼叫show()來顯示非模式對話方塊。show()立即返回,這樣呼叫程式碼中的控制流將會繼續。在實踐中你將會經常呼叫show()並且在呼叫show()的函式最後,控制返回主事件迴圈。

上述是我從其他網站上摘抄的,我感覺寫的很好。

非模式對話方塊,說白了,就像你打開了好幾個QQ聊天視窗,每個聊天視窗都是一個非模式對話方塊,想和誰聊和誰聊,只要點選那個視窗就可以輸入聊天資訊進行傳送了。

二.模式對話方塊

模式對話方塊就是阻塞同一應用程式中其它可視視窗的輸入的對話方塊:使用者必須完成這個對話方塊中的互動操作並且關閉了它之後才能訪問應用程式中的其它任何視窗。模式對話方塊有它們自己的本地事件迴圈。用來讓使用者選擇一個檔案或者用來設定應用程式引數的對話方塊通常是模式的。呼叫exec()來顯示模式對話方塊。當用戶關閉這個對話方塊,exec()將提供一個可用的返回值並且這時流程控制繼續從呼叫exec()的地方進行。通常,我們連線預設按鈕,例如“OK”到accept()槽並且把“Cancel”連線到reject()槽,來使對話方塊關閉並且返回適當的值。另外我們也可以連線done()槽,傳遞給它

AcceptedRejected

還是我從其它網站上摘抄的,我還是感覺寫的很好。

非模式對話方塊,說白了,就像你開啟QQ聊天視窗,如果這個視窗是模式對話方塊,那麼完蛋了,你必須要先和這貨聊完天,然後關閉這個視窗,你才能繼續幹其他的事情,否則,你根本無法去操作其他的視窗。

OK,下面舉一個簡單的例子:

1)建立一個widget的類,此為主視窗介面

2)再建立一個mydialog類,此為子視窗介面

那麼,我希望在子視窗介面上做一個按鍵,一旦按下,子視窗介面消失,進入主視窗中。(QT教程與軟體裡面的第二章)

1.看下圖,其中sender為該“進入主視窗”這個按鍵,clicked為按下這個按鍵要傳送的訊號。muyDialog為當前子類的物件,而accept為當前的槽函式。

連在一起的意思是,按下按鍵後,傳送click的訊號,然後accept這個槽函式收到訊號,然後執行。accept()的作用是:將當前的視窗隱藏(這樣就做到子視窗功能消失這個功能),並且傳送accepted訊號,也就是設定設定結果程式碼為Accepted

.

2.在main函式中,寫入如下程式碼:

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    Widget w;

    myDialog my1;      //建立一個指向子視窗的物件

    if(my1.exec() == QDialog::Accepted)
    {
        w.show();
        return a.exec();
    }
    else
    {
        return 0;
    }


}

首先,my1.exec()的意思是:執行模式對話方塊。按照之前對模式對話方塊的講述,my1.exec()的意思就是,顯示子視窗,並在這裡阻塞住,知道該視窗被關閉之後,才繼續往下執行

正因為在這裡阻塞住了,所以才沒有顯示主視窗,因為w.show()沒有被執行!

後面就好理解了,當子視窗的那個按鍵按下後,發出accepted的訊號,if(my1.exec() == QDialog::Accepted)這句話成立,所以子視窗關閉,繼續執行到w.show()這句話,然後顯示主視窗。

到現在為止,所有的功能都實現了。