在上一節中,我們已經清楚的瞭解到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]