QT通用對話方塊,代碼來自《精通QT4編程》,方便日後查詢。
main.cpp
#include <QtGui/QApplication><br />#include <QtCore/QTextCodec><br />#include "dialogbuildin.h"</p><p>int main(int argc, char *argv[])<br />{<br />QApplication app(argc, argv);</p><p>QTextCodec* pTextCodec = QTextCodec::codecForLocale();<br />QTextCodec::setCodecForTr(pTextCodec);</p><p>CDialogBuildin dlg;</p><p>return dlg.exec();<br />}
dialogbuildin.h
#pragma once</p><p>#include <QDialog></p><p>class QTextEdit;<br />class QPushButton;<br />class CDialogBuildin : public QDialog<br />{<br />Q_OBJECT</p><p>public:<br />CDialogBuildin(QWidget *parent = 0);<br />virtual ~CDialogBuildin();</p><p>private:<br />QTextEdit*m_pTextEditDisplay;<br />QPushButton*m_pPushBtnColor;<br />QPushButton*m_pPushBtnError;<br />QPushButton*m_pPushBtnFile;<br />QPushButton*m_pPushBtnFont;<br />QPushButton*m_pPushBtnInput;<br />QPushButton*m_pPushBtnPage;<br />QPushButton*m_pPushBtnProgress;<br />QPushButton*m_pPushBtnPrint;</p><p>private slots:<br />voiddoPushBtn();<br />};
dialogbuildin.cpp
#include "dialogbuildin.h"<br />#include <QtGui/QtGui></p><p>CDialogBuildin::CDialogBuildin(QWidget *parent)<br />: QDialog(parent)<br />{<br />m_pTextEditDisplay = new QTextEdit(tr("QT的標準通用對話方塊。"));</p><p>QGridLayout* pGridLayout = new QGridLayout();</p><p>m_pPushBtnColor = new QPushButton(tr("顏色對話方塊"));<br />m_pPushBtnError = new QPushButton(tr("錯誤訊息框"));<br />m_pPushBtnFile = new QPushButton(tr("檔案對話方塊"));<br />m_pPushBtnFont = new QPushButton(tr("字型對話方塊"));<br />m_pPushBtnInput = new QPushButton(tr("輸入對話方塊"));<br />m_pPushBtnPage = new QPushButton(tr("頁設定對話方塊"));<br />m_pPushBtnProgress = new QPushButton(tr("進度對話方塊"));<br />m_pPushBtnPrint = new QPushButton(tr("列印對話方塊"));</p><p>pGridLayout->addWidget(m_pPushBtnColor,0,0,1,1);<br />pGridLayout->addWidget(m_pPushBtnError,0,1,1,1);<br />pGridLayout->addWidget(m_pPushBtnFile,0,2,1,1);<br />pGridLayout->addWidget(m_pPushBtnFont,1,0,1,1);<br />pGridLayout->addWidget(m_pPushBtnInput,1,1,1,1);<br />pGridLayout->addWidget(m_pPushBtnPage,1,2,1,1);<br />pGridLayout->addWidget(m_pPushBtnProgress,2,0,1,1);<br />pGridLayout->addWidget(m_pPushBtnPrint,2,1,1,1);<br />pGridLayout->addWidget(m_pTextEditDisplay,3,0,3,3);</p><p>setLayout(pGridLayout);</p><p>connect(m_pPushBtnColor,SIGNAL(clicked()),this,SLOT(doPushBtn()));<br />connect(m_pPushBtnError,SIGNAL(clicked()),this,SLOT(doPushBtn()));<br />connect(m_pPushBtnFile,SIGNAL(clicked()),this,SLOT(doPushBtn()));<br />connect(m_pPushBtnFont,SIGNAL(clicked()),this,SLOT(doPushBtn()));<br />connect(m_pPushBtnInput,SIGNAL(clicked()),this,SLOT(doPushBtn()));<br />connect(m_pPushBtnPage,SIGNAL(clicked()),this,SLOT(doPushBtn()));<br />connect(m_pPushBtnProgress,SIGNAL(clicked()),this,SLOT(doPushBtn()));<br />connect(m_pPushBtnPrint,SIGNAL(clicked()),this,SLOT(doPushBtn()));</p><p>setWindowTitle(tr("內建對話方塊"));<br />resize(400,300);<br />}</p><p>CDialogBuildin::~CDialogBuildin()<br />{</p><p>}</p><p>void CDialogBuildin::doPushBtn()<br />{<br />QPushButton* btn = qobject_cast<QPushButton*>(sender());<br />if(btn == m_pPushBtnColor)<br />{<br />// 顏色對話方塊<br />// 擷取文本編輯框對象的調色盤<br />QPalette palette = m_pTextEditDisplay->palette();</p><p>// 通過QColorDialog的靜態函數getColor建立一個模態的顏色對話方塊<br />// 第一個參數為顏色對話方塊顯示的初始顏色值<br />// 第二個參數為顏色對話方塊的父視窗<br />// 若點擊"取消"將返回一個無效的顏色,否則將返回選擇的顏色值<br />const QColor& color = QColorDialog::getColor(palette.color(QPalette::Base),this);</p><p>// 判斷顏色是否有效<br />if(color.isValid())<br />{<br />// 修改調色盤中的顏色組<br />palette.setColor(QPalette::Base,color);<br />m_pTextEditDisplay->setPalette(palette);<br />}<br />}<br />else if(btn == m_pPushBtnError)<br />{<br />// 錯誤對話方塊<br />QErrorMessage box(this);<br />box.setWindowTitle(tr("錯誤訊息框"));<br />box.showMessage(tr("錯誤訊息框執行個體xx."));<br />box.showMessage(tr("錯誤訊息框執行個體yy."));<br />box.showMessage(tr("錯誤訊息框執行個體zz."));<br />box.showMessage(tr("錯誤訊息框執行個體wu."));<br />box.showMessage(tr("錯誤訊息框執行個體ya."));<br />box.exec();<br />}<br />else if(btn == m_pPushBtnFile)<br />{<br />// 檔案對話方塊<br />// 通過QFileDialog的靜態函數getOpenFileName返回選擇的檔案路徑<br />/**</p><p>QString strFilePath = QFileDialog::getOpenFileName(this,tr("開啟檔案"),QString(),<br />tr("任何檔案(*.*)"";;文字檔(*.txt)"";;XML檔案(*.xml)"));</p><p>*/<br />QFileDialog dlg;<br />dlg.setViewMode(QFileDialog::Detail);<br />dlg.setFileMode(QFileDialog::ExistingFiles);<br />dlg.setAcceptMode(QFileDialog::AcceptOpen);<br />dlg.setFilter(tr("任何檔案(*.*)"";;文字檔(*.txt)"";;XML檔案(*.xml)"));<br />dlg.setWindowTitle(tr("開啟檔案"));<br />dlg.setResolveSymlinks(false);<br />dlg.setNameFilterDetailsVisible(false);</p><p>QStringList strListFilePath;<br />QString strFilePath;<br />if(dlg.exec() == QDialog::Accepted)<br />{<br />strListFilePath = dlg.selectedFiles();<br />strFilePath = strListFilePath.first();<br />}</p><p>m_pTextEditDisplay->setText(strFilePath);<br />}<br />else if(btn == m_pPushBtnFont)<br />{<br />// 字型對話方塊<br />bool bok;<br />const QFont& font = QFontDialog::getFont(&bok,m_pTextEditDisplay->font(),this,tr("字型對話方塊"));</p><p>if(bok)<br />{<br />// 如果是確定,設定字型<br />m_pTextEditDisplay->setFont(font);<br />}<br />}<br />else if(btn == m_pPushBtnInput)<br />{<br />// 輸入對話方塊<br />bool ok;<br />QString text = QInputDialog::getText(this,tr("輸入對話方塊"),tr("輸入文本:"),QLineEdit::Normal,QDir::home().dirName(),&ok);</p><p>if(ok && !text.isEmpty())<br />m_pTextEditDisplay->setText(text);<br />}<br />else if(btn == m_pPushBtnPage)<br />{<br />// 頁設定對話方塊<br />QPrinter printer;<br />QPageSetupDialog dlg(&printer,this);<br />dlg.setWindowTitle(tr("頁設定對話方塊"));<br />if(dlg.exec() == QDialog::Accepted)<br />{<br />// 進行下一步處理<br />}<br />}<br />else if(btn == m_pPushBtnProgress)<br />{<br />// 進度對話方塊<br />QProgressDialog progress(tr("正在複製檔案..."),<br />tr("取消"),<br />0,<br />10000,<br />this);</p><p>progress.setWindowModality(Qt::WindowModal);///< 設定進度條對話方塊顯示模式為模態對話方塊<br />progress.setWindowTitle(tr("進度對話方塊"));<br />progress.show();</p><p>for(int i=0;i<10000;++i)<br />{<br />progress.setValue(i);///< 設定進度條當前值</p><p>// 模態對話方塊必須調用,以保證事件迴圈還可以處理其他事件,以防止應用程式因為長時間的操作而導致沒有反應<br />// 或調用 QEventLoop::processEvents(QEventLoop::ExcludeUserInputEvents)<br />// 1> qApp->processEvents();<br />// 2><br />QEventLoop EventLoop;<br />EventLoop.processEvents(QEventLoop::ExcludeUserInputEvents);</p><p>if(progress.wasCanceled())///< 判斷進度條是否點了“取消”按鈕<br />break;</p><p>//... 複製檔案處理<br />qDebug() << i;<br />}</p><p>progress.setValue(10000);///< 進度條達到最大值,將自動關閉對話方塊<br />}<br />else if(btn == m_pPushBtnPrint)<br />{<br />// 列印對話方塊<br />QPrinter printer;<br />QPrintDialog dlg(&printer,this);<br />dlg.setWindowTitle(tr("列印對話方塊"));<br />if(dlg.exec() == QDialog::Accepted)<br />{<br />// 進行下一步處理<br />}<br />}<br />}