您好,登錄后才能下訂單哦!
????????在上節博客中我們介紹了顏色對話框。那么在日常生活中,除了顏色對話框,我們經常見到的還有字體對話框、進度對話框以及打印對話框。本節我們就來介紹下在 QT 中這三個對話框分別是怎樣實現的。
????????我們首先建立一個帶有 FontDialogBtn、ProgressDialogBtn、PrintDialogBtn 三個 QPushButton 按鈕的界面,來分別實現字體對話框、進度對話框以及打印對話框,代碼如下:
????????Widget.h 如下所示:
#include?<QWidget>#include?<QPushButton> class?Widget?:?public?QWidget { ????Q_OBJECT private: ????QPushButton?FontDialogBtn; ????QPushButton?ProgressDialogBtn; ????QPushButton?PrintDialogBtn; private?slots: ????void?FontDialogBtn_Clicked(); ????void?ProgressDialogBtn_Clicked(); ????void?PrintDialogBtn_Clicked(); public: ????Widget(QWidget?*parent?=?0); ????~Widget(); };
????????Widget.cpp 如下所示:
#include?"Widget.h" #include?<QDebug> #include?<QTextDocument> #include?<QPrinter> #include?<QPrintDialog> #include?<QProgressDialog> #include?<QFontDialog> Widget::Widget(QWidget?*parent)?:?QWidget(parent), ????FontDialogBtn(this),?ProgressDialogBtn(this),?PrintDialogBtn(this) { ????FontDialogBtn.setText("Font?Dialog"); ????FontDialogBtn.move(20,?20); ????FontDialogBtn.resize(160,?30); ????ProgressDialogBtn.setText("Progress?Dialog"); ????ProgressDialogBtn.move(20,?70); ????ProgressDialogBtn.resize(160,?30); ????PrintDialogBtn.setText("Print?Dialog"); ????PrintDialogBtn.move(20,?120); ????PrintDialogBtn.resize(160,?30); ????resize(200,?170); ????setFixedSize(200,?170); ????connect(&FontDialogBtn,?SIGNAL(clicked()),?this,?SLOT(FontDialogBtn_Clicked())); ????connect(&ProgressDialogBtn,?SIGNAL(clicked()),?this,?SLOT(ProgressDialogBtn_Clicked())); ????connect(&PrintDialogBtn,?SIGNAL(clicked()),?this,?SLOT(PrintDialogBtn_Clicked())); } void?Widget::FontDialogBtn_Clicked() { } void?Widget::ProgressDialogBtn_Clicked() { } void?Widget::PrintDialogBtn_Clicked() { } Widget::~Widget() { }
????????我們構建后,發現出現一個錯誤,說 QPrintDialog 頭文件沒定義,可是我們在幫助里查到 QPrintDialog 是在這個頭文件里定義的,那么為什么會報錯呢?經過仔細查看,在包含頭文件下面有
qmake: | QT += printsupport |
這么一行話,我們就在 test.pro 文件里加上這句,那么下面我們構建既不會出錯了。運行之后出現我們期待的界面,如下:
????????但是我們點擊之后,并沒有什么反應。當然了,對應函數的內容還沒有實現呢。下來我們就來一一實現這三個對話框。
????????我們就先來實現第一個字體對話框。首先在 Qt 中提供了預定義的字體對話框 QFontDialog 類, QFontDialog 類用于提供選擇字體的對話框部件。字體對話框的使用方式大體如下:
????????具體到代碼就是:
void?Widget::FontDialogBtn_Clicked() { ???QFontDialog?dlg(this); ???dlg.setWindowTitle("Font?Dialog?Test"); ???dlg.setCurrentFont(QFont("Courier?New",?10,?QFont::Bold));??//?設置屬性:名字為Courier?New,大小為10,類型為Bold ???if(?dlg.exec()?==?QFontDialog::Accepted?) ???{ ???????qDebug()?<<?dlg.selectedFont(); ???} }
????????構建運行后,得到的效果圖如下:
?
????????那么我們得到的屬性是不是和上面我們設置的一樣呢?我們點擊OK,打印出來的屬性如下所示:
????????接下來我們就來實現進度對話框,那么在 Qt 中也提供了預定義的進度對話框 QProgressDialog 類,QProgressDialog 類用于顯示進度信息,QProgressDialog 類用于需要用戶等待的場合。那么我們進度對話框的使用大體流程如下:
????????具體代碼如下:
void?Widget::ProgressDialogBtn_Clicked() { ????QProgressDialog?dlg(this); ????dlg.setWindowTitle("Updating...");??//?設置名字 ????dlg.setLabelText("Downloading?update?from?server...");??//?設置對話框信息 ????dlg.setMinimum(0);??????//?設置最小值 ????dlg.setMaximum(100);????//?設置最大值 ????dlg.setValue(35);???????//?設置進度條信息 ????dlg.exec(); }
????????構建運行后得到如圖所示的進度對話框:
????????接下來我們繼續實現打印對話框。那么在 Qt 中也提供了預定義的打印對話框 QPrintDialog 類,QPrintDialog 類用于設置打印相關的參數信息。Qt 中的?QPrinter 類是打印設備及其參數的封裝,QPrinter 類封裝了系統中打印設備的驅動接口,QPrinter 以相同方式使用系統中的不同打印設備。
打印對話框的大體使用流程如下:
????????具體到代碼入如下:
void?Widget::PrintDialogBtn_Clicked() { ????QPrintDialog?dlg(this); ????dlg.setWindowTitle("Print?Dialog?Test"); ????if(?dlg.exec()?==?QPrintDialog::Accepted?) ????{ ????????QPrinter*?p?=?dlg.printer(); ????????QTextDocument?td; ????????td.setPlainText("Printer?object?test!");????//?文件內容是Printer?object?test! ????????p->setOutputFileName("F:\\test.pdf");???//?在F盤生成test.pdf文件 ????????td.print(p); ????} }
????????在這里我們使用的虛擬打印機,選擇PDF格式的,得到的效果圖如下:
????????我們打開F盤,如下,我們發現文件生成的時間就是剛才。再打開看下內容就是我們剛設置的。
????????我們還可以再做個試驗,加上 td.setHtml("<h2>Print html object test</hl>"); 這句,再將文件類型改成 .xps 格式的。構建運行,選擇 XPS 虛擬打印機進行打印,如下:
????????我們再到F盤看看,生成 text.xps 文件,內容和剛才一樣。如下:
?????????那么我們今天學習了字體對話框、進度對話框以及打印對話框三種對話框的相關知識,那么在 Qt 中標準對話框的設計模式就是:1、GUI界面部件產生數據對象;2、業務邏輯中的其它對象使用數據對象;3、GUI界面與業務邏輯用過數據對象鏈接。今天的學習就到此啦,后面我們繼續學習 Qt 相關的知識。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。