qt學習筆記(四)之對話框-Qt內建對話框

在上一節中,我們已經清楚的瞭解到QDialog的子類,像QColorDialog,QFontDiog等,這些對話框我們稱之爲內建對話框,又叫標準對話框


這一節我們主要講解下標準對話框的一些使用方法。

一、下圖爲我們要設計出來的主界面


窗口的繪製,這裏就不在敘述了。

特別說明下:窗口的繪製我沒有使用佈局管理器,而是自己“設計”的佈局。

resize(320, 240);   

首先我調用QWidget::resize(intw,inth) 來設置對話框窗口大小。

然後設計其他部件格局

    //自定義佈局
    infoTextEdit->setGeometry(QRect(20, 130, 280, 100));
    colorBtn->setGeometry(QRect(20 , 10, 80, 30));
    errorBtn->setGeometry(QRect(120 , 10, 80, 30));
    fileBtn->setGeometry(QRect(220 , 10, 80, 30));
    fontBtn->setGeometry(QRect(20 , 50, 80, 30));
    inputBtn->setGeometry(QRect(120 , 50, 80, 30));
    pageBtn->setGeometry(QRect(220 , 50, 80, 30));
    progressBtn->setGeometry(QRect(20 , 90, 80, 30));
    printBtn->setGeometry(QRect(120 , 90, 80, 30));
主要是調用了QWidget::setGeometry(intax,intay,intaw,intah

當然,我們還要對按鈕進行“信號與槽”編輯

可以設計一個槽函數,然後再內部進行按鈕對象的識別。

當信號被激活,應用程序會進入槽函數。我們就可以根據sender()來進行發送信號的對象

QPushButton *btn = qobject_cast<QPushButton *>(sender());

T qobject_cast ( QObject * object )

完成類型的轉換,將<QObject *>類型的對象指針轉換爲類型爲<T *>的對象指針,如果轉換成功,返回正確的對象指針,否則返回0。

------------------------------------------------

Returns the given object cast to type T if the object is of type T (or of a subclass); otherwise returns 0. If object is 0 then it will also return 0.

The class T must inherit (directly or indirectly) QObject and be declared with the Q_OBJECT macro.

------------------------------------------------

類型T必須直接繼承或者間接繼承QObject 類,並且在該類的定義裏有Q_OBJECT宏變量(否則qobject_cast返回值是未定義的)

二、顏色對話框


下面的代碼是關於顏色對話框的應用

        QPalette palette = infoTextEdit->palette(); //獲取文本編輯的調色板對象
        //QColor color = QColorDialog::getColor(QPalette::Base, this);
        //顏色對話框的初始顏色值爲文本編輯的背景色
        QColor color = QColorDialog::getColor(palette.color(QPalette::Base), this);
        //如果用戶在顏色對話框點擊取消的話,得到的color是無效的
        if(color.isValid())
        {
            //QPalette::Base 通常用於背景色
            palette.setColor(QPalette::Base, color);
            infoTextEdit->setPalette(palette);
        }
這裏我們用上了調色板,調色板可以用來設置窗口部件、按鈕窗口部件、文本輸入窗口部件的背景色和前景色,通過ColorRole來指定,在Qt的文檔中都有說明。

三、錯誤消息框

        QErrorMessage msgbox(this);

        //這裏主要是爲了區別錯誤消息框中的”再次顯示消息“
        msgbox.setWindowTitle(tr("錯誤消息框"));
        msgbox.showMessage(tr("錯誤消息框1"));
        msgbox.showMessage(tr("錯誤消息框1"));
        msgbox.showMessage(tr("錯誤消息框1"));
        msgbox.showMessage(tr("錯誤消息框2"));
        msgbox.showMessage(tr("錯誤消息框3"));
        msgbox.exec();
我們可以創建一個QErrorMessage對象,然後分別設置顯示內容,最後讓該對話框執行。

如果我們不用exec(),而是直接show(),這時候會發現錯誤消息框一閃而過。

因爲msgbox的生存週期在show()完就結束了,所以我們還是調用exec()。應用程序會在用戶關閉消息對話框後,才return 出來。

這樣講很不恰當~~語言能力有限,哎~~只能這麼解釋了。

四、文件對話框


        QString FileName = QFileDialog::getOpenFileName(this, tr("打開文件"), "/home", tr("任何文件(*.c)"));

        infoTextEdit->setText(FileName);
文件對話框的創建比較簡單.QFileDialog::getOpenFileName()第三個參數爲設定初始默認路徑,第四個參數是過濾器。可以這麼說:過濾器指定的文件格式纔有效。

五、字體對話框

        bool ok;
        QFont font = QFontDialog::getFont(&ok, infoTextEdit->font(), this, tr("字體對話框"));
        if(ok)
        {
            infoTextEdit->setFont(font);
        }
當我們選擇好要設置的字體格式,點擊OK後,bool ok的值爲true。

六、輸入對話框


        bool ok;
        QString text = QInputDialog::getText(this, tr("輸入對話框"), tr("輸入文本"), QLineEdit::Normal, tr("fuck"), &ok);

        //判斷
        if(ok && !text.isEmpty())
        {
            infoTextEdit->setText(text);
        }
輸入對話框就不介紹了,我們也可以定義自己的輸入對話框類。

七、頁面設置對話框


        QPrinter printer;
        QPageSetupDialog pageDlg(&printer, this);
        pageDlg.setWindowTitle(tr("頁面設置對話框"));
        if(pageDlg.exec() == QDialog::Accepted)
        {
            //下一步處理
        }
我們都可以查看Qt的幫助文檔,來完成這些程序設計。

八、進度對話框

        QProgressDialog progressDlg(tr("正在複製文件"), tr("取消"), 0, 10000, this);
        progressDlg.setWindowTitle(tr("進度條對話框"));
        //設置爲模態對話框
        progressDlg.setWindowModality(Qt::WindowModal);
        //如果這裏使用exec 進度對話框會卡主
        progressDlg.show();
        for(int i = 0; i < 10000; i++)
        {
            progressDlg.setValue(i);
            qApp->processEvents();

            if(progressDlg.wasCanceled())
            {
                break;
            }
        }
        progressDlg.setValue(10000);
我們可以通過調用QProgressDialog::setValue(intprogress)來設置進度。

這裏的進度對話框,我們必須show(),如果調用exec()的話,界面會卡住~。親,注意show()和exec()的使用哦~~

qApp->processEvents();

親,注意上面的函數。如果我把該函數屏蔽掉,會感覺界面很卡。

網友的解釋是:

--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
處理下事件。 
比如有個事務處理比較耗時間,你可以在中間不時地processEvents()下,這樣好讓界面處理一下各種事件,避免看上去無反應像死掉一樣。

--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
九、

        QPrinter printer;
        QPrintDialog printDlg(&printer, this);
        printDlg.setWindowTitle(tr("打印對話框"));
        if(printDlg.exec() == QDialog::Accepted)
        {

        }

十、關於const 變量引用

eg:

void fun(const QString &str);

形參str是對常量對象的引用,因此可以傳入臨時QString 對象作爲實參。然而對非常量對象的引用,不具名的對象、臨時對象、和具體數值是不能夠作爲實參的。


在這裏附上程序源代碼下載鏈接:http://download.csdn.net/detail/fzu_dianzi/3743682

以上純屬個人學習筆記,如果哪裏錯了,希望提出。願和大家一起共同學習,一起進步。我的郵箱地址是:[email protected]







發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章