溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

QT之字體、進(jìn)度、打印對(duì)話框(十八)

發(fā)布時(shí)間:2020-08-05 13:34:24 來(lái)源:網(wǎng)絡(luò) 閱讀:2606 作者:上帝之子521 欄目:開(kāi)發(fā)技術(shù)

????????在上節(jié)博客中我們介紹了顏色對(duì)話框。那么在日常生活中,除了顏色對(duì)話框,我們經(jīng)常見(jiàn)到的還有字體對(duì)話框、進(jìn)度對(duì)話框以及打印對(duì)話框。本節(jié)我們就來(lái)介紹下在 QT 中這三個(gè)對(duì)話框分別是怎樣實(shí)現(xiàn)的。

????????我們首先建立一個(gè)帶有 FontDialogBtn、ProgressDialogBtn、PrintDialogBtn 三個(gè) QPushButton 按鈕的界面,來(lái)分別實(shí)現(xiàn)字體對(duì)話框、進(jìn)度對(duì)話框以及打印對(duì)話框,代碼如下:

????????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()
{

}

????????我們構(gòu)建后,發(fā)現(xiàn)出現(xiàn)一個(gè)錯(cuò)誤,說(shuō) QPrintDialog 頭文件沒(méi)定義,可是我們?cè)趲椭锊榈?QPrintDialog 是在這個(gè)頭文件里定義的,那么為什么會(huì)報(bào)錯(cuò)呢?經(jīng)過(guò)仔細(xì)查看,在包含頭文件下面有

qmake:

QT += printsupport

這么一行話,我們就在 test.pro 文件里加上這句,那么下面我們構(gòu)建既不會(huì)出錯(cuò)了。運(yùn)行之后出現(xiàn)我們期待的界面,如下:

QT之字體、進(jìn)度、打印對(duì)話框(十八)

????????但是我們點(diǎn)擊之后,并沒(méi)有什么反應(yīng)。當(dāng)然了,對(duì)應(yīng)函數(shù)的內(nèi)容還沒(méi)有實(shí)現(xiàn)呢。下來(lái)我們就來(lái)一一實(shí)現(xiàn)這三個(gè)對(duì)話框。

????????我們就先來(lái)實(shí)現(xiàn)第一個(gè)字體對(duì)話框。首先在 Qt 中提供了預(yù)定義的字體對(duì)話框 QFontDialog 類, QFontDialog 類用于提供選擇字體的對(duì)話框部件。字體對(duì)話框的使用方式大體如下:

QT之字體、進(jìn)度、打印對(duì)話框(十八)

????????具體到代碼就是:

void?Widget::FontDialogBtn_Clicked()
{
???QFontDialog?dlg(this);

???dlg.setWindowTitle("Font?Dialog?Test");
???dlg.setCurrentFont(QFont("Courier?New",?10,?QFont::Bold));??//?設(shè)置屬性:名字為Courier?New,大小為10,類型為Bold

???if(?dlg.exec()?==?QFontDialog::Accepted?)
???{
???????qDebug()?<<?dlg.selectedFont();
???}
}

????????構(gòu)建運(yùn)行后,得到的效果圖如下:

? QT之字體、進(jìn)度、打印對(duì)話框(十八)

????????那么我們得到的屬性是不是和上面我們?cè)O(shè)置的一樣呢?我們點(diǎn)擊OK,打印出來(lái)的屬性如下所示:

QT之字體、進(jìn)度、打印對(duì)話框(十八)

????????接下來(lái)我們就來(lái)實(shí)現(xiàn)進(jìn)度對(duì)話框,那么在 Qt 中也提供了預(yù)定義的進(jìn)度對(duì)話框 QProgressDialog 類,QProgressDialog 類用于顯示進(jìn)度信息,QProgressDialog 類用于需要用戶等待的場(chǎng)合。那么我們進(jìn)度對(duì)話框的使用大體流程如下:

QT之字體、進(jìn)度、打印對(duì)話框(十八)

????????具體代碼如下:

void?Widget::ProgressDialogBtn_Clicked()
{
????QProgressDialog?dlg(this);

????dlg.setWindowTitle("Updating...");??//?設(shè)置名字
????dlg.setLabelText("Downloading?update?from?server...");??//?設(shè)置對(duì)話框信息
????dlg.setMinimum(0);??????//?設(shè)置最小值
????dlg.setMaximum(100);????//?設(shè)置最大值
????dlg.setValue(35);???????//?設(shè)置進(jìn)度條信息

????dlg.exec();
}

????????構(gòu)建運(yùn)行后得到如圖所示的進(jìn)度對(duì)話框:

QT之字體、進(jìn)度、打印對(duì)話框(十八)

????????接下來(lái)我們繼續(xù)實(shí)現(xiàn)打印對(duì)話框。那么在 Qt 中也提供了預(yù)定義的打印對(duì)話框 QPrintDialog 類,QPrintDialog 類用于設(shè)置打印相關(guān)的參數(shù)信息。Qt 中的?QPrinter 類是打印設(shè)備及其參數(shù)的封裝,QPrinter 類封裝了系統(tǒng)中打印設(shè)備的驅(qū)動(dòng)接口QPrinter 以相同方式使用系統(tǒng)中的不同打印設(shè)備。

打印對(duì)話框的大體使用流程如下:

QT之字體、進(jìn)度、打印對(duì)話框(十八)

????????具體到代碼入如下:

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!");????//?文件內(nèi)容是Printer?object?test!

????????p->setOutputFileName("F:\\test.pdf");???//?在F盤生成test.pdf文件

????????td.print(p);
????}
}

????????在這里我們使用的虛擬打印機(jī),選擇PDF格式的,得到的效果圖如下:

QT之字體、進(jìn)度、打印對(duì)話框(十八)

????????我們打開(kāi)F盤,如下,我們發(fā)現(xiàn)文件生成的時(shí)間就是剛才。再打開(kāi)看下內(nèi)容就是我們剛設(shè)置的。

QT之字體、進(jìn)度、打印對(duì)話框(十八)

QT之字體、進(jìn)度、打印對(duì)話框(十八)

????????我們還可以再做個(gè)試驗(yàn),加上 td.setHtml("<h2>Print html object test</hl>"); 這句,再將文件類型改成 .xps 格式的。構(gòu)建運(yùn)行,選擇 XPS 虛擬打印機(jī)進(jìn)行打印,如下:

QT之字體、進(jìn)度、打印對(duì)話框(十八)

????????我們?cè)俚紽盤看看,生成 text.xps 文件,內(nèi)容和剛才一樣。如下:

QT之字體、進(jìn)度、打印對(duì)話框(十八)QT之字體、進(jìn)度、打印對(duì)話框(十八)

?????????那么我們今天學(xué)習(xí)了字體對(duì)話框、進(jìn)度對(duì)話框以及打印對(duì)話框三種對(duì)話框的相關(guān)知識(shí),那么在 Qt 中標(biāo)準(zhǔn)對(duì)話框的設(shè)計(jì)模式就是:1、GUI界面部件產(chǎn)生數(shù)據(jù)對(duì)象;2、業(yè)務(wù)邏輯中的其它對(duì)象使用數(shù)據(jù)對(duì)象;3、GUI界面與業(yè)務(wù)邏輯用過(guò)數(shù)據(jù)對(duì)象鏈接。今天的學(xué)習(xí)就到此啦,后面我們繼續(xù)學(xué)習(xí) Qt 相關(guān)的知識(shí)。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI