国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Qt5開發(fā)及實例V2.0-第四章Qt基本對話框

這篇具有很好參考價值的文章主要介紹了Qt5開發(fā)及實例V2.0-第四章Qt基本對話框。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

第4章 Qt 5基本對話框

首先介紹標準文件對話框(QFileDialog)、標準顏色對話框(QColorDialog)、標準字體對話框(QFontDialog)、標準輸入對話框(QInputDialog)及標準消息對話框(QMessageBox),運行效果如圖4.1所示。
Qt5開發(fā)及實例V2.0-第四章Qt基本對話框,QT5,ARM?MCU,Linux,qt,數(shù)據(jù)庫,服務器,嵌入式硬件,開發(fā)語言,運維

按如圖4.1所示依次執(zhí)行如下操作。
(1)單擊“文件標準對話框實例”按鈕,彈出“文件選擇”對話框(open file dialog),如圖4.2所示。
Qt5開發(fā)及實例V2.0-第四章Qt基本對話框,QT5,ARM?MCU,Linux,qt,數(shù)據(jù)庫,服務器,嵌入式硬件,開發(fā)語言,運維
(2)單擊“顏色標準對話框實例”按鈕,彈出“顏色選擇”對話框(Select Color),如圖4.3所示。
Qt5開發(fā)及實例V2.0-第四章Qt基本對話框,QT5,ARM?MCU,Linux,qt,數(shù)據(jù)庫,服務器,嵌入式硬件,開發(fā)語言,運維
(3)單擊“字體標準對話框實例”按鈕,彈出“字體選擇”對話框(Select Font),如圖4.4所示。
Qt5開發(fā)及實例V2.0-第四章Qt基本對話框,QT5,ARM?MCU,Linux,qt,數(shù)據(jù)庫,服務器,嵌入式硬件,開發(fā)語言,運維
(4)標準輸入對話框包括:標準字符串輸入對話框、標準條目選擇對話框、標準int類型輸入對話框和標準double類型輸入對話框。
單擊“標準輸入對話框實例”按鈕,彈出界面“標準輸入對話框實例”界面,如圖4.5(a)所示。其中,“標準輸入對話框實例”界面中,若是調用“修改姓名”輸入框,則為一個QLineEdit,如圖4.5(b)所示;若是調用“修改性別”列表框,則為一個QComboBox,如圖4.5(c)所示;若是調用“修改年齡”(int類型)或“修改成績”(double類型)輸入框,則為一個QSpinBox,如圖4.5(d)和圖4.5(e)所示。
Qt5開發(fā)及實例V2.0-第四章Qt基本對話框,QT5,ARM?MCU,Linux,qt,數(shù)據(jù)庫,服務器,嵌入式硬件,開發(fā)語言,運維
(a)“標準輸入對話框實例”界面 (b)“修改姓名”界面 (c)“修改性別”界面

Qt5開發(fā)及實例V2.0-第四章Qt基本對話框,QT5,ARM?MCU,Linux,qt,數(shù)據(jù)庫,服務器,嵌入式硬件,開發(fā)語言,運維
(d)“修改年齡”界面 (e)“修改成績”界面
圖4.5 “標準輸入對話框實例”界面

(5)單擊“標準消息對話框實例”按鈕,彈出“標準消息對話框實例”界面,如圖4.6(a)所示?!皹藴氏υ捒驅嵗苯缑姘ā癚uestion消息框”(如圖4.6(b)所示)、“Information消息框”(如圖4.6(c)所示)、“Warning消息框”(如圖4.6(d)所示)、“Critical消息框”(如圖4.6(e)所示)、“About消息框”(如圖4.6(f)所示)和“About Qt消息框”(如圖4.6(g)所示)。

Qt5開發(fā)及實例V2.0-第四章Qt基本對話框,QT5,ARM?MCU,Linux,qt,數(shù)據(jù)庫,服務器,嵌入式硬件,開發(fā)語言,運維
(a)“標準消息對話框實例”界面 (b)Question消息框

Qt5開發(fā)及實例V2.0-第四章Qt基本對話框,QT5,ARM?MCU,Linux,qt,數(shù)據(jù)庫,服務器,嵌入式硬件,開發(fā)語言,運維
Qt5開發(fā)及實例V2.0-第四章Qt基本對話框,QT5,ARM?MCU,Linux,qt,數(shù)據(jù)庫,服務器,嵌入式硬件,開發(fā)語言,運維

(6)如果以上所有的標準消息框都不能滿足開發(fā)的需求,此處還介紹了Qt允許的Custom(自定義)消息框的使用方法。單擊“用戶自定義消息對話框實例”按鈕,彈出“用戶自定義消息框”界面,如圖4.7所示。
Qt5開發(fā)及實例V2.0-第四章Qt基本對話框,QT5,ARM?MCU,Linux,qt,數(shù)據(jù)庫,服務器,嵌入式硬件,開發(fā)語言,運維
各種基本對話框通過調用各自不同的靜態(tài)函數(shù)來完成其功能,具體說明見表4.1。
Qt5開發(fā)及實例V2.0-第四章Qt基本對話框,QT5,ARM?MCU,Linux,qt,數(shù)據(jù)庫,服務器,嵌入式硬件,開發(fā)語言,運維
【例】(難度一般)(CH401)完成如圖4.1所示的界面顯示。
操作步驟如下。
新建Qt Widgets Application,項目名為“DialogExample”,基類選擇“QDialog”,類名保持“Dialog”不變,取消“創(chuàng)建界面”復選框的選中狀態(tài)。
在“dialog.cpp”文件中的Dialog 的構造函數(shù)中應該添加如下代碼:
setWindowTitle(tr(“各種標準對話框的實例”));
以便能夠顯示該工程的對話框標題。

4.1 標準文件對話框類

4.1.1 函數(shù)說明

在此僅詳細說明getOpenFileName()靜態(tài)函數(shù)中各個參數(shù)的作用,其他文件對話框類中相關的靜態(tài)函數(shù)的參數(shù)有與其類似之處。
其函數(shù)形式如下:

QString QFileDialog::getOpenFileName
(	
	QWidget* parent=0,             		//標準文件對話框的父窗口
	const QString & caption=QString(),	//標準文件對話框的標題名
	const QString & dir=QString(),  	//注(1)
	const QString & filter=QString(),	//注(2)
	QString * selectedFilter=0, 		//用戶選擇的過濾器通過此參數(shù)返回
	Options options=0         		//選擇顯示文件名的格式,默認是同時顯示目錄與文件名
)

4.1.2 創(chuàng)建步驟

下面是創(chuàng)建一個標準文件對話框的詳細步驟。
(1)在“dialog.h”中,添加private成員變量如下:

QPushButton *fileBtn;
QLineEdit *fileLineEdit;
QGridLayout *mainLayout;

(2)添加槽函數(shù):

private slots:
	void showFile();

在開始部分添加頭文件:

#include <QLineEdit>
#include <QGridLayout>

(3)在“dialog.cpp”文件的構造函數(shù)中添加如下代碼:

fileBtn=new QPushButton;                   	//各個控件對象的初始化
fileBtn->setText(tr("文件標準對話框實例")); 
fileLineEdit=new QLineEdit;                	//用來顯示選擇的文件名

添加布局管理:

mainLayout=new QGridLayout(this);           	//布局設計
mainLayout->addWidget(fileBtn,0,0);
mainLayout->addWidget(fileLineEdit,0,1);

最后添加事件關聯(lián):

connect(fileBtn,SIGNAL(clicked()),this,SLOT(showFile()));	//事件關聯(lián)

其中,槽函數(shù)showFile()的具體實現(xiàn)代碼如下:

void Dialog::showFile()
{
    QString s = QFileDialog::getOpenFileName(this,"open file dialog","/",
                      "C++ files(*.cpp);;C files(*.c);;Head files(*.h)");
    fileLineEdit->setText(s);
}

在“dialog.cpp”文件的開始部分添加頭文件:

#include <QGridLayout>
#include <QFileDialog>
#include <QPushButton>

(4)運行該程序后,單擊“文件標準對話框實例”按鈕后顯示的界面如圖4.2所示。

4.2 標準顏色對話框類

4.2.1 函數(shù)說明

getColor()函數(shù)是標準顏色對話框QColorDialog類的一個靜態(tài)函數(shù),該函數(shù)返回用戶選擇的顏色值,下面是getColor()函數(shù)形式:

QColor getColor
(
	const QColor& initial=Qt::white,   		//注
	QWidget* parent=0             		//標準顏色對話框的父窗口
);

4.2.2 創(chuàng)建步驟

下面是創(chuàng)建一個標準顏色對話框的詳細步驟。
(1)在“dialog.h”中,添加private成員變量如下:

QPushButton *colorBtn;
QFrame *colorFrame;

(2)添加槽函數(shù):

void showColor();

(3)在“dialog.cpp”中,構造函數(shù)中的代碼如下:

colorBtn=new QPushButton;                		//創(chuàng)建各個控件的對象
colorBtn->setText(tr("顏色標準對話框實例"));
colorFrame=new QFrame;
colorFrame->setFrameShape(QFrame::Box);
colorFrame->setAutoFillBackground(true);

其中,QFrame類的對象colorFrame用于根據(jù)用戶選擇的不同顏色更新不同的背景。
在布局管理中添加代碼:

mainLayout->addWidget(colorBtn,1,0);                    	 //布局設計
mainLayout->addWidget(colorFrame,1,1);

最后添加事件關聯(lián):
connect(colorBtn,SIGNAL(clicked()),this,SLOT(showColor()));//事件關聯(lián)
其中,槽函數(shù)showColor()的實現(xiàn)代碼如下:

void Dialog::showColor()
{
    QColor c = QColorDialog::getColor(Qt::blue);
    if(c.isValid())
    {
        colorFrame->setPalette(QPalette(c));
    }
}

(4)在文件開始添加頭文件:

#include <QColorDialog>

(5)運行該程序后,單擊“顏色標準對話框實例”按鈕后顯示的界面如圖4.3所示。選擇某個顏色,單擊“OK”按鈕,選擇的顏色將顯示在Dialog對話框右邊的標簽中。

4.3 標準字體對話框類

4.3.1 函數(shù)說明

getFont()函數(shù)是標準字體對話框QFontDialog類的一個靜態(tài)函數(shù),該函數(shù)返回用戶所選擇的字體,下面是getFont()函數(shù)形式:

QFont getFont
(
	bool* ok,            			//注
	QWidget* parent=0    		//標準字體對話框的父窗口
); 

4.3.2 創(chuàng)建步驟

下面是創(chuàng)建標準字體對話框的詳細步驟。
(1)在“dialog.h”中,添加private成員變量如下:

QPushButton *fontBtn; 
QLineEdit *fontLineEdit;

(2)添加槽函數(shù):
void showFont();
(3)在“dialog.cpp”中,構造函數(shù)中的代碼如下:

fontBtn=new QPushButton;                       	//創(chuàng)建控件的對象
fontBtn->setText(tr("字體標準對話框實例"));
fontLineEdit=new QLineEdit;                    	//顯示更改的字符串
fontLineEdit->setText(tr("Welcome!"));

添加布局管理:

mainLayout->addWidget(fontBtn,2,0);         		//布局設計
mainLayout->addWidget(fontLineEdit,2,1);

最后添加事件關聯(lián):

connect(fontBtn,SIGNAL(clicked()),this,SLOT(showFont()));    //事件關聯(lián)

其中,槽函數(shù)showFont()的實現(xiàn)代碼如下:

void Dialog::showFont()
{
    bool ok;
    QFont f = QFontDialog::getFont(&ok);
    if (ok)
    {
        fontLineEdit->setFont(f);
    }
}

(4)在文件的開頭添加頭文件:

#include <QFontDialog>

(5)運行該程序后,單擊“字體標準對話框實例”按鈕后顯示的界面如圖4.4所示。選擇某個字體,單擊“OK”按鈕,文字將應用選擇的字體格式更新顯示在Dialog對話框右邊的標簽中。

4.4 標準輸入對話框類

(1)在“DialogExample”項目名上單擊鼠標右鍵,在彈出的快捷菜單中選擇“添加新文件…”菜單項,在彈出的對話框中選擇“C++ Class”選項,單擊“Choose…”按鈕,彈出對話框,在“Base class”后面的文本框中輸入基類名“QDialog”(需要由用戶手動輸入),在“Class name”后面的文本框中輸入類的名稱“InputDlg”。
(2)單擊“下一步”按鈕,單擊“完成”按鈕,在該工程中就添加了“inputdlg.h”頭文件和“inputdlg.cpp”源文件。
(3)打開“inputdlg.h”頭文件,完成所需要的各種控件的創(chuàng)建和各種功能的槽函數(shù)的聲明,具體代碼如下。
(4)打開“inputdlg.cpp”源文件,完成所需要的各種控件的創(chuàng)建和槽函數(shù)的實現(xiàn),具體代碼如下。

完成主對話框的操作過程如下。
(1)在“dialog.h”中,添加頭文件:

#include "inputdlg.h"

添加private成員變量:

QPushButton *inputBtn;

添加實現(xiàn)標準輸入對話框實例的InputDlg類:

InputDlg *inputDlg;

(2)添加槽函數(shù):

void showInputDlg();

(3)在“dialog.cpp”中,構造函數(shù)中的代碼如下:

inputBtn=new QPushButton;                       	//創(chuàng)建控件的對象
inputBtn->setText(tr("標準輸入對話框實例"));

添加布局管理:

mainLayout->addWidget(inputBtn,3,0);             	//布局設計

最后添加事件關聯(lián):

connect(inputBtn,SIGNAL(clicked()),this,SLOT(showInputDlg()));
        					//事件關聯(lián)

其中,槽函數(shù)showInputDlg()的實現(xiàn)代碼如下:

void Dialog::showInputDlg()
{
    inputDlg =new InputDlg(this);
    inputDlg->show();    
}

(4)運行該程序后,單擊“標準輸入對話框實例”按鈕后顯示的界面如圖4.5(a)所示。

4.4.1 標準字符串輸入對話框

標準字符串輸入對話框通過QInputDialog類的靜態(tài)函數(shù)getText()完成,getText()函數(shù)形式如下:

QString getText
(
	QWidget* parent,         		//標準輸入對話框的父窗口
	const QString& title,   		//標準輸入對話框的標題名
	const QString& label,   		//標準輸入對話框的標簽提示
	QLineEdit::EchoMode mode=QLineEdit::Normal, 
				   //指定標準輸入對話框中QLineEdit控件的輸入模式
	const QString& text=QString(),	
//標準字符串輸入對話框彈出時QLineEdit控件中默認出現(xiàn)的文字
	bool* ok=0,                 		//注
	Qt::WindowFlags flags=0     		//指明標準輸入對話框的窗體標識
);    

接著上述的程序,完成“inputdlg.cpp”文件中的槽函數(shù)ChangeName()的實現(xiàn)。具體代碼如下:

void InputDlg::ChangeName()
{
    bool ok;
    QString text=QInputDialog::getText(this,tr("標準字符串輸入對話框"), tr("請輸入姓名:"), QLineEdit::Normal,nameLabel2->text(),&ok);
    if (ok && !text.isEmpty())
       nameLabel2->setText(text);
}

在“inputdlg.cpp”文件的開頭添加頭文件:

#include <QInputDialog>

再次運行程序,單擊“修改姓名”按鈕后出現(xiàn)對話框,可在該對話框內修改姓名,如圖4.5(b)所示。

4.4.2 標準條目選擇對話框

標準條目選擇對話框是通過QInputDialog類的靜態(tài)函數(shù)getItem()來完成的,getItem()函數(shù)形式如下:

QString getItem
(
	QWidget* parent,            	//標準輸入對話框的父窗口
	const QString& title,       	//標準輸入對話框的標題名
	const QString& label,       	//標準輸入對話框的標簽提示
	const QStringList& items,  	//注(1)
	int current=0,               	//注(2) 
	bool editable=true,       	//指定QComboBox控件中顯示的文字是否可編輯
	bool* ok=0,                  	//注(3)
	Qt::WindowFlags flags=0     	//指明標準輸入對話框的窗體標識
);

(2)標準條目選擇對話框彈出時QComboBox控件中默認顯示的條目序號。
(3)指示標準輸入對話框的哪個按鈕被觸發(fā),若ok為true,則表示用戶單擊了“OK”(確定)按鈕;若ok為false,則表示用戶單擊了“Cancle”(取消)按鈕。

同上,接著上述的程序,完成“inputdlg.cpp”文件中的槽函數(shù)ChangeSex()的實現(xiàn)。具體代碼如下:

void InputDlg::ChangeSex()
{
    	QStringList SexItems;
    	SexItems << tr("男") << tr("女");
    	bool ok;
    	QString SexItem = QInputDialog::getItem(this, tr("標準條目選擇對話框"),
          tr("請選擇性別:"), SexItems, 0, false, &ok);
	if (ok && !SexItem.isEmpty())
	     sexLabel2->setText(SexItem);
}

再次運行程序,單擊“修改性別”按鈕后出現(xiàn)對話框,可在該對話框內選擇性別,如圖4.5(c)所示。

4.4.3 標準int類型輸入對話框

標準int類型輸入對話框是通過QInputDialog類的靜態(tài)函數(shù)getInt()來完成的,getInt()函數(shù)形式如下:

int getInt
(
	QWidget* parent,            	//標準輸入對話框的父窗口
	const QString& title,       	//標準輸入對話框的標題名
	const QString& label,       	//標準輸入對話框的標簽提示
	int value=0,          	 	//指定標準輸入對話框中QSpinBox控件的默認顯示值
	int min=-2147483647,        	//指定QSpinBox控件的數(shù)值范圍
	int max=2147483647,
	int step=1,                   	//指定QSpinBox控件的步進值
	bool* ok=0,                   	//注
	Qt::WindowFlags flags=0    	//指明標準輸入對話框的窗口標識
); 

同上,接著上述的程序,完成“inputdlg.cpp”文件中的槽函數(shù)ChangeAge()的實現(xiàn)。具體代碼如下:

void InputDlg::ChangeAge()
{
    	bool ok;
    	int age = QInputDialog::getInt(this, tr("標準int類型輸入對話框"),
         tr("請輸入年齡:"), ageLabel2->text().toInt(&ok), 0, 100, 1, &ok);
    	if (ok)
    	    ageLabel2->setText(QString(tr("%1")).arg(age));
}

再次運行程序,單擊“修改年齡”按鈕后出現(xiàn)對話框,可在該對話框內修改年齡,如圖4.5(d)所示。

4.4.4 標準double類型輸入對話框

標準double類型輸入對話框是通過QInputDialog類的靜態(tài)函數(shù)getDouble()來完成的,getDouble()函數(shù)形式如下:

double getDouble
(
	QWidget* parent,             	//標準輸入對話框的父窗口
	const QString& title,       	//標準輸入對話框的標題名
	const QString& label,   	//標準輸入對話框的標簽提示
	double value=0,       	//指定標準輸入對話框中QSpinBox控件默認的顯示值
	double min=-2147483647,    	//指定QSpinBox控件的數(shù)值范圍
	double max=2147483647,
	int decimals=1,              	//指定QSpinBox控件的步進值
	bool* ok=0,                  	//注
	Qt::WindowFlags flags=0     //指明標準輸入對話框的窗口標識
); 

同上,接著上述的程序,完成“inputdlg.cpp”文件中槽函數(shù)ChangeScore()的實現(xiàn)。具體代碼如下:

void InputDlg::ChangeScore()
{
    	bool ok;
    	double score = QInputDialog::getDouble(this, tr("標準double類型輸入對話框"),tr("請輸入成績:"),scoreLabel2->text().toDouble(&ok), 0, 100, 1, &ok);
  	if (ok)
	scoreLabel2->setText(QString(tr("%1")).arg(score));
}

再次運行程序,單擊“修改成績”按鈕后出現(xiàn)對話框,可在該對話框內修改成績,如圖4.5(e)所示。

4.5 消息對話框類

下面的例子演示了各種消息對話框的使用。首先完成界面的設計,具體實現(xiàn)步驟如下。
(1)添加該工程主要顯示標準消息對話框界面的函數(shù)所在的文件,在“DialogExample”項目名上單擊鼠標右鍵,在彈出的快捷菜單中選擇“添加新文件…”菜單項,在彈出的對話框中選擇“C++ Class”選項,單擊“Choose…”按鈕,彈出對話框,在“Base class”后面的下拉列表框中輸入基類名“QDialog”,在“Class name”后面的文本框中輸入類的名稱“MsgBoxDlg”。
(2)單擊“下一步”按鈕,單擊“完成”按鈕,在該工程中就添加了“msgboxdlg.h”頭文件和“msgboxdlg.cpp”源文件。
(3)打開“msgboxdlg.h”頭文件,完成所需要的各種控件的創(chuàng)建和完成功能的槽函數(shù)的聲明,具體代碼如下。
(4)打開“msgboxdlg.cpp”源文件,完成所需要的各種控件的創(chuàng)建和完成槽函數(shù)的實現(xiàn),具體代碼如下。

下面是完成主對話框的操作過程。
(1)在“dialog.h”中,添加頭文件:

#include "msgboxdlg.h"

添加private成員變量如下:

QPushButton  *MsgBtn;

添加實現(xiàn)各種消息對話框實例的MsgBoxDlg類:

MsgBoxDlg *msgDlg;

(2)添加槽函數(shù):

void showMsgDlg();

(3)在“dialog.cpp”中,構造函數(shù)中的代碼如下:

MsgBtn =new QPushButton;                              //創(chuàng)建控件對象
MsgBtn->setText(tr("標準消息對話框實例"));

添加布局管理:

mainLayout->addWidget(MsgBtn,3,1);

最后添加事件關聯(lián):

connect(MsgBtn,SIGNAL(clicked()),this,SLOT(showMsgDlg()));

其中,槽函數(shù)showMsgDlg()的實現(xiàn)代碼如下:

void Dialog::showMsgDlg()
{
    msgDlg =new MsgBoxDlg();
    msgDlg->show();
}

(4)運行該程序后,單擊“標準消息對話框實例”按鈕后,顯示效果如圖4.6(a)所示。

4.5.1 Question消息框

Question消息框使用QMessageBox::question()函數(shù)完成,此函數(shù)形式如下:

StandardButton QMessageBox::question
(
	QWidget* parent,                       		//消息框的父窗口指針
	const QString& title,                 		//消息框的標題欄
	const QString& text,                 		//消息框的文字提示信息
	StandardButtons buttons=Ok,         		//注(1)
	StandardButton defaultButton=NoButton		//注(2)
); 

完成文件“msgboxdlg.cpp”中的槽函數(shù)showQuestionMsg(),具體代碼如下:

void MsgBoxDlg::showQuestionMsg()
{
    label->setText(tr("Question Message Box"));
    switch(QMessageBox::question(this,tr("Question消息框"),
          tr("您現(xiàn)在已經(jīng)修改完成,是否要結束程序?"),
          QMessageBox::Ok|QMessageBox::Cancel,QMessageBox::Ok))
    {
    case QMessageBox::Ok:
        label->setText("Question button/Ok");
        break;
    case QMessageBox::Cancel:
        label->setText("Question button/Cancel");
        break;
    default:
        break;
    }
    return;
}

在“msgboxdlg.cpp”的開頭添加頭文件:

#include <QMessageBox>

運行程序,單擊“QuestionMsg”按鈕后,顯示效果如圖4.6(b)所示。

4.5.2 Information消息框

Information消息框使用QMessageBox::information()函數(shù)完成,函數(shù)形式如下:

StandardButton QMessageBox::information
(
	QWidget*parent,                   			//消息框的父窗口指針
	const QString& title,           			//消息框的標題欄
	const QString& text,             			//消息框的文字提示信息
	StandardButtons buttons=Ok,      		//同Question消息框的注釋內容
	StandardButton defaultButton=NoButton	//同Question消息框的注釋內容
); 

完成文件“msgboxdlg.cpp”中的槽函數(shù)showInformationMsg(),具體代碼如下:

void MsgBoxDlg::showInformationMsg()
{
    label->setText(tr("Information Message Box"));
    QMessageBox::information(this,tr("Information消息框"),
                             tr("這是Information消息框測試,歡迎您!"));
    return;
}

運行程序,單擊“InformationMsg”按鈕后,顯示效果如圖4.6(c)所示。

4.5.3 Warning消息框

Warning消息框使用QMessageBox::warning()函數(shù)完成,函數(shù)形式如下:

StandardButton QMessageBox::warning
(
	QWidget* parent,           		//消息框的父窗口指針
	const QString& title,     		//消息框的標題欄
	const QString& text,         		//消息框的文字提示信息
	StandardButtons buttons=Ok,  	//同Question消息框的注釋內容
	StandardButton defaultButton=NoButton  //同Question消息框的注釋內容
); 

完成文件“msgboxdlg.cpp”中的槽函數(shù)showWarningMsg(),具體代碼如下。
運行程序,單擊“WarningMsg”按鈕后,顯示效果如圖4.6(d)所示。

4.5.4 Critical消息框

Critical消息框使用QMessageBox::critical()函數(shù)完成,函數(shù)形式如下:

StandardButton QMessageBox::critical
(
	QWidget* parent,              			//消息框的父窗口指針
	const QString& title,         			//消息框的標題欄
	const QString& text,          			//消息框的文字提示信息
	StandardButtons buttons=Ok,  		//同Question消息框的注釋內容
	StandardButton defaultButton=NoButton  	//同Question消息框的注釋內容
); 

完成文件“msgboxdlg.cpp”中的槽函數(shù)showCriticalMsg(),具體代碼如下:

void MsgBoxDlg::showCriticalMsg()
{
	label->setText(tr("Critical Message Box"));
	QMessageBox::critical(this,tr("Critical消息框"),tr("這是一個Critical消息框測試!"));
	return;
}

運行程序,單擊“CriticalMsg”按鈕后,顯示效果如圖4.6(e)所示。

4.5.5 About消息框

About消息框使用QMessageBox::about()函數(shù)完成,函數(shù)形式如下:

void QMessageBox::about
(
	QWidget* parent,           			//消息框的父窗口指針
	const QString& title,         			//消息框的標題欄
	const QString& text        			//消息框的文字提示信息
);

完成文件“msgboxdlg.cpp”中的槽函數(shù)showAboutMsg(),具體代碼如下:

void MsgBoxDlg::showAboutMsg()
{
	label->setText(tr("About Message Box"));
	QMessageBox::about(this,tr("About消息框"),tr("這是一個About消息框測試!"));
	return;
}

運行程序,單擊“AboutMsg”按鈕后,顯示效果如圖4.6(f)所示。

4.5.6 About Qt消息框

About Qt消息框使用QMessageBox:: aboutQt()函數(shù)完成,函數(shù)形式如下:

void QMessageBox::aboutQt
(
	QWidget* parent,                 		//消息框的父窗口指針
	const QString& title=QString()      	//消息框的標題欄
); 

完成文件“msgboxdlg.cpp”中的槽函數(shù)showAboutQtMsg(),具體代碼如下:

void MsgBoxDlg::showAboutQtMsg()
{
    label->setText(tr("About Qt Message Box"));
    QMessageBox::aboutQt(this,tr("About Qt消息框"));
    return;
}

運行程序,單擊“AboutQtMsg”按鈕后,顯示效果如圖4.6(g)所示。

4.6 自定義消息框

下面介紹自定義(Custom)消息框的具體創(chuàng)建方法。
(1)在“dialog.h”中添加private成員變量:

QPushButton *CustomBtn;
QLabel *label;

(2)添加槽函數(shù):

void showCustomDlg();

(3)在“dialog.cpp”中的構造函數(shù)中添加如下代碼:

CustomBtn =new QPushButton;
CustomBtn->setText(tr("用戶自定義消息對話框實例"));
label =new QLabel;
label->setFrameStyle(QFrame::Panel|QFrame::Sunken);

添加布局管理:

mainLayout->addWidget(CustomBtn,4,0);
mainLayout->addWidget(label,4,1);

在Dialog構造函數(shù)的最后添加事件關聯(lián)代碼:

connect(CustomBtn,SIGNAL(clicked()),this,SLOT(showCustomDlg()));

其中,“dialog.cpp”文件中的槽函數(shù)showCustomDlg()實現(xiàn)的具體代碼。
在開始部分加上頭文件:

#include <QMessageBox>

其中,
(a) QPushButton *yesBtn=customMsgBox.addButton(tr(“Yes”),QMessageBox:: ActionRole):定義消息框所需的按鈕,由于QMessageBox::standardButtons只提供了常用的一些按鈕,并不能滿足所有應用的需求,故QMessageBox類提供了一個addButton()函數(shù)來為消息框增加自定義的按鈕,addButton()函數(shù)的第1個參數(shù)為按鈕顯示的文字,第2個參數(shù)為按鈕類型的描述。
(b) QPushButton *cancelBtn=customMsgBox.addButton(QMessageBox::Cancel):為addButton()函數(shù)加入一個標準按鈕。
? customMsgBox.setText(tr(“這是一個用戶自定義消息框!”)):設置自定義消息框中顯示的提示信息內容。
(d) customMsgBox.setIconPixmap(QPixmap(“Qt.png”)):設置自定義消息框的圖標。

(4)為了能夠在自定義消息框中顯示Qt圖標,請將事先準備好的圖片Qt.png復制到D:\Qt\CH4\CH401\build-DialogExample-Desktop_Qt_5_8_0_MinGW_32bit-Debug目錄下。運行該程序后,單擊“用戶自定義消息對話框實例”按鈕后,顯示效果如圖4.7所示。

4.7 工具盒類

【例】(難度一般)(CH402)通過實現(xiàn)類似QQ抽屜效果的實例來介紹QToolBox類的使用,運行效果如圖4.8所示。

下面介紹實現(xiàn)的具體步驟。
(1)新建Qt Widgets Application(詳見1.3.1節(jié)),項目名稱為“MyQQExample”,基類選擇“QDialog”,取消“創(chuàng)建界面”復選框的選中狀態(tài)。
(2)添加該工程的提供主要顯示界面的函數(shù)所在的文件,在“MyQQExample”項目名上單擊鼠標右鍵,在彈出的快捷菜單中選擇“添加新文件…”菜單項,在彈出的對話框中選擇“C++ Class”選項。單擊“Choose…”按鈕,彈出對話框,在“Base class”后面的文本框中輸入基類名“QToolBox”(手工添加),在“Class name”后面的文本框中輸入類的名稱“Drawer”。
(3)單擊“下一步”按鈕,單擊“完成”按鈕,添加“drawer.h”頭文件和“drawer.cpp”源文件。

(4)Drawer類繼承自QToolBox類,打開“drawer.h”頭文件,定義實例中需要用到的各種窗體控件。具體代碼如下:

#include <QToolBox>
#include <QToolButton>
class Drawer : public QToolBox
{
	Q_OBJECT
public:
	Drawer(QWidget *parent=0,Qt::WindowFlags f=0);
private:
	QToolButton *toolBtn1_1;
	QToolButton *toolBtn1_2;
	QToolButton *toolBtn1_3;
	QToolButton *toolBtn1_4;
	QToolButton *toolBtn1_5;
	QToolButton *toolBtn2_1;
	QToolButton *toolBtn2_2;
	QToolButton *toolBtn3_1;
	QToolButton *toolBtn3_2;
};

(5)打開“drawer.cpp”源文件,添加以下代碼。
其中,
(a) toolBtn1_1 =new QToolButton:創(chuàng)建一個QToolButton類實例,分別對應于抽屜中的每一個按鈕。
(b) toolBtn1_1->setText(tr(“張三”)):設置按鈕的文字。
? toolBtn1_1->setIcon(QPixmap(“11.png”)):設置按鈕的圖標。
(d)toolBtn1_1->setIconSize(QPixmap(“11.png”).size()):設置按鈕的大小,本例將其設置為與圖標的大小相同。
(e) toolBtn1_1->setAutoRaise(true):當鼠標離開時,按鈕自動恢復為彈起狀態(tài)。
(f) toolBtn1_1->setToolButtonStyle(Qt::ToolButtonTextBesideIcon):設置按鈕的ToolButtonStyle屬性。
(g) QGroupBox *groupBox1=new QGroupBox:創(chuàng)建一個QGroupBox類實例,在本例中對應每一個抽屜。QGroupBox *groupBox2=new QGroupBox、QGroupBox *groupBox3=new QGroupBox創(chuàng)建其余兩欄抽屜。
(h) QVBoxLayout *layout1=new QVBoxLayout(groupBox1):創(chuàng)建一個QVBoxLayout類實例,用來設置抽屜內各個按鈕的布局。
(i) layout1->addStretch():在按鈕之后插入一個占位符,使得所有按鈕能夠靠上對齊,并且在整個抽屜大小發(fā)生改變時保證按鈕的大小不發(fā)生變化。

(6)在“drawer.cpp”文件的一開始加入以下頭文件:

#include <QGroupBox>
#include <QVBoxLayout>

(7)打開“main.cpp”文件,添加以下代碼:

#include "dialog.h"
#include <QApplication>
#include "drawer.h"
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    Drawer drawer;
    drawer.show();
    return a.exec();
}

(8)編譯運行此程序,此時未看到加載的圖片,這是因為圖片放置的路徑不是默認的,只要將需用到的圖片放置到D:\Qt\CH4\CH402\build-MyQQExample-Desktop_Qt_5_8_0_ MinGW_32bit-Debug文件夾下即可。最后運行該程序,顯示效果如圖4.8所示。

4.8 進度條

Qt提供了兩種顯示進度條的方式:一種是QProgressBar(如圖4.9所示),提供了一種橫向或縱向顯示進度的控件表示方式,用來描述任務的完成情況;另一種是QProgressDialog(如圖4.10所示),提供了一種針對慢速過程的進度對話框表示方式,用于描述任務完成的進度情況。
【例】(簡單)(CH403)實現(xiàn)圖4.9和圖4.10中的顯示進度條。
Qt5開發(fā)及實例V2.0-第四章Qt基本對話框,QT5,ARM?MCU,Linux,qt,數(shù)據(jù)庫,服務器,嵌入式硬件,開發(fā)語言,運維
實現(xiàn)步驟如下。
(1)新建Qt Widgets Application(詳見1.3.1節(jié)),項目名稱為“Progress”,基類選擇“QDialog”,類名命名為“ProgressDlg”,取消“創(chuàng)建界面”復選框的選中狀態(tài)。單擊“下一步”按鈕,最后單擊“完成”按鈕,完成該文件工程的建立。
(2)ProgressDlg類繼承自QDialog類,打開“progressdlg.h”頭文件,添加如下加黑代碼。
(3)構造函數(shù)主要完成主界面的初始化工作,包括各控件的創(chuàng)建、布局及信號/槽的連接。打開“progressdlg.cpp”文件,添加以下代碼。
其中,槽函數(shù)startProgress()的具體代碼。

其中,
(a) int num =FileNumLineEdit->text().toInt(&ok):獲取當前需要復制的文件數(shù)目,這里對應進度條的總步進值。
(b) progressBar->setRange(0,num):設置進度條的步進范圍從0到需要復制的文件數(shù)目。
? progressBar->setValue(i):模擬每一個文件的復制過程,進度條總的步進值為需要復制的文件數(shù)目。當復制完一個文件后,步進值增加1。
(d) progressDialog->setWindowModality(Qt::WindowModal):設置進度對話框采用模態(tài)方式進行顯示,即顯示進度的同時,其他窗口將不響應輸入信號。
(e) progressDialog->setMinimumDuration(5):設置進度對話框出現(xiàn)需等待的時間,此處設定為5秒,默認為4秒。
(f) progressDialog->setWindowTitle(tr(“Please Wait”)):設置進度對話框的窗體標題。
(g) progressDialog->setLabelText(tr(“Copying…”)):設置進度對話框的顯示文字信息。
(h) progressDialog->setCancelButtonText(tr(“Cancel”)):設置進度對話框的“取消”按鈕的顯示文字。
(i) progressDialog->setValue(i):模擬每一個文件的復制過程,進度條總的步進值為需要復制的文件數(shù)目。當復制完一個文件后,步進值增加1。
(j) if(progressDialog->wasCanceled()):檢測“取消”按鈕是否被觸發(fā),若觸發(fā)則退出循環(huán)并關閉進度對話框。

(4)運行程序,查看顯示效果。
QProgressBar類有如下幾個重要的屬性。
? minimum、maximum:決定進度條指示的最小值和最大值。
? format:決定進度條顯示文字的格式,可以有三種顯示格式,即%p%、%v和%m。其中,%p%顯示完成的百分比,這是默認顯示方式;%v顯示當前的進度值;%m顯示總的步進值。
? invertedAppearance:可以使進度條以反方向顯示進度。
進度條使用了一個步進值的概念,即一旦設置好進度條的最大值和最小值,進度條將會顯示完成的步進值占總的步進值的百分比,百分比的計算公式為:
百分比=(value()-minimum())/(maximum()-minimum())

QFont font("ZYSong18030",12);
setFont(font);
setWindowTitle(tr("Progress"));

4.9 調色板與電子鐘

4.9.1 QPalette類

在本節(jié)中詳細介紹QPalette類的使用方法,該類有兩個基本的概念:一個是ColorGroup,另一個是ColorRole。其中,ColorGroup指的是以下三種不同的狀態(tài)。
? QPalette::Active:獲得焦點的狀態(tài)。
? QPalette::Inactive:未獲得焦點的狀態(tài)。
? QPalette::Disable:不可用狀態(tài)。
QPalette類使用最多、最重要的函數(shù)是setColor()函數(shù),其原型如下:

void QPalette::setColor(ColorGroup group,ColorRole role,const QColor & color);

對主題顏色進行設置的同時,還區(qū)分了狀態(tài),即對某個主題在某個狀態(tài)下的顏色進行了設置:

void QPalette::setColor(ColorRole role,const QColor & color);

QPalette類同時還提供了setBrush()函數(shù),通過畫刷的設置對顯示進行更改,這樣就有可能使用圖片而不僅是單一的顏色來對主題進行填充。Qt之前的版本中有關背景色設置的函數(shù)如setBackgroundColor()或前景色設置的函數(shù)如setForegroundColor()在Qt 5中都被廢止,統(tǒng)一由QPalette類進行管理。例如,setBackgroundColor()函數(shù)可由以下語句代替:

xxx->setAutoFillBackground(true);
QPalette p = xxx->palette();
p.setColor(QPalette::Window,color);//p.setBrush(QPalette::Window,brush);
xxx->setPalette(p);

【例】(難度一般)(CH404)利用QPalette改變控件顏色的方法。本實例實現(xiàn)的窗體分為兩部分:左邊部分用于對不同主題顏色的選擇,右邊部分用于顯示選擇的顏色對窗體外觀的改變。運行效果如圖4.11所示。
Qt5開發(fā)及實例V2.0-第四章Qt基本對話框,QT5,ARM?MCU,Linux,qt,數(shù)據(jù)庫,服務器,嵌入式硬件,開發(fā)語言,運維
實現(xiàn)步驟如下。
(1)新建Qt Widgets Application (詳見1.3.1節(jié)),項目名稱為“Palette”,基類選擇“QDialog”,類名命名為“Palette”,取消“創(chuàng)建界面”復選框的選中狀態(tài)。單擊“下一步”按鈕,最后單擊“完成”按鈕,完成該項目工程的建立。
(2)定義的Palette類繼承自QDialog類,打開“palette.h”文件,聲明實例中所用到的函數(shù)和控件,具體代碼。
(3)打開“palette.cpp”文件,添加以下代碼:

#include <QHBoxLayout>
#include <QGridLayout>
Palette::Palette(QWidget *parent)
    : QDialog(parent)
{
    createCtrlFrame();
    createContentFrame();
    QHBoxLayout *mainLayout =new QHBoxLayout(this);
    mainLayout->addWidget(ctrlFrame);
    mainLayout->addWidget(contentFrame);
}

createCtrlFrame()函數(shù)用于創(chuàng)建顏色選擇區(qū)。

createContentFrame()函數(shù)用于顯示選擇的顏色對窗體外觀的改變,具體代碼如下:

void Palette::createContentFrame()
{
	contentFrame =new QFrame;                		//具體顯示面板
	label1 =new QLabel(tr("請選擇一個值:"));
	comboBox1 =new QComboBox;
	label2 =new QLabel(tr("請輸入字符串:"));
	lineEdit2 =new QLineEdit;
	textEdit =new QTextEdit;
	QGridLayout *TopLayout =new QGridLayout;
    	TopLayout->addWidget(label1,0,0);
    	TopLayout->addWidget(comboBox1,0,1);
    	TopLayout->addWidget(label2,1,0);
    	TopLayout->addWidget(lineEdit2,1,1);
    	TopLayout->addWidget(textEdit,2,0,1,2);
    	OkBtn =new QPushButton(tr("確認"));
    	CancelBtn =new QPushButton(tr("取消"));
    	QHBoxLayout *BottomLayout =new QHBoxLayout;
    	BottomLayout->addStretch(1);
    	BottomLayout->addWidget(OkBtn);
    	BottomLayout->addWidget(CancelBtn);
    	QVBoxLayout *mainLayout =new QVBoxLayout(contentFrame);
    	mainLayout->addLayout(TopLayout);
    	mainLayout->addLayout(BottomLayout);
}

ShowWindow()函數(shù)用于響應對背景顏色的選擇:

void Palette::ShowWindow()
{
	//獲得當前選擇的顏色值
    	QStringList colorList = QColor::colorNames();
    	QColor color = QColor(colorList[windowComboBox->currentIndex()]);
    	QPalette p = contentFrame->palette();			//(a)
    	p.setColor(QPalette::Window,color);			//(b)
	//把修改后的調色板信息應用到contentFrame窗體中,更新顯示
    	contentFrame->setPalette(p);
    	contentFrame->update();
}

ShowWindowText()函數(shù)響應對文字顏色的選擇,即對前景色進行設置,具體代碼如下:

void Palette::ShowWindowText()
{
    QStringList colorList = QColor::colorNames();
    QColor color = colorList[windowTextComboBox->currentIndex()];
    QPalette p = contentFrame->palette();
    p.setColor(QPalette::WindowText,color);
    contentFrame->setPalette(p);
}

ShowButton()函數(shù)響應對按鈕背景色的選擇:

void Palette::ShowButton()
{
    QStringList colorList = QColor::colorNames();
    QColor color =QColor(colorList[buttonComboBox->currentIndex()]);
    QPalette p = contentFrame->palette();
    p.setColor(QPalette::Button,color);
    contentFrame->setPalette(p);
    contentFrame->update();
}

ShowButtonText()函數(shù)響應對按鈕上文字顏色的選擇:

void Palette::ShowButtonText()
{
    QStringList colorList = QColor::colorNames();
    QColor color = QColor(colorList[buttonTextComboBox->currentIndex()]);
    QPalette p =contentFrame->palette();
    p.setColor(QPalette::ButtonText,color);
    contentFrame->setPalette(p);
}

ShowBase()函數(shù)響應對可輸入文本框背景色的選擇:

void Palette::ShowBase()
{
    QStringList colorList = QColor::colorNames();
    QColor color = QColor(colorList[baseComboBox->currentIndex()]);
    QPalette p = contentFrame->palette();
    p.setColor(QPalette::Base,color);
    contentFrame->setPalette(p);
}

fillColorList()函數(shù)用于插入顏色:

void Palette::fillColorList(QComboBox *comboBox)
{
    	QStringList colorList = QColor::colorNames();	//(a)
    	QString color;				//(b)
    	foreach(color,colorList)			//對顏色名列表進行遍歷
    	{
        	QPixmap pix(QSize(70,20));			//(c)
        	pix.fill(QColor(color));			 //為pix填充當前遍歷的顏色
        	comboBox->addItem(QIcon(pix),NULL);		//(d)
        	comboBox->setIconSize(QSize(70,20));		//(e)
        comboBox->setSizeAdjustPolicy(QComboBox::AdjustToContents);
						//(f)
    	}
}

其中,
(a) QStringList colorList = QColor::colorNames():獲得Qt所有知道名稱的顏色名列表,返回的是一個字符串列表colorList。
(b) QString color:新建一個QString對象,為循環(huán)遍歷做準備。
? QPixmap pix(QSize(70,20)):新建一個QPixmap對象pix作為顯示顏色的圖標。
(d) comboBox->addItem(QIcon(pix),NULL):調用QComboBox的addItem()函數(shù)為下拉列表框插入一個條目,并以準備好的pix作為插入條目的圖標,名稱設為NULL,即不顯示顏色的名稱。
(e) comboBox->setIconSize(QSize(70,20)):設置圖標的尺寸,圖標默認尺寸是一個方形,將它設置為與pix相同尺寸的長方形。
(f) comboBox->setSizeAdjustPolicy(QComboBox::AdjustToContents):設置下拉列表框的尺寸調整策略為AdjustToContents(符合內容的大小)。
(4)運行程序,顯示效果如圖4.11所示。

4.9.2 QTime類

為便于顯示,toString()函數(shù)的參數(shù)需指定轉換后時間的顯示格式。
? H/h:小時(若使用H表示小時,則無論何時都以24小時制顯示小時;若使用h表示小時,則當同時指定AM/PM時,采用12小時制顯示小時,其他情況下仍采用24小時制進行顯示)。
? m:分鐘。
? s:秒鐘。
? AP/A:顯示AM或PM。
? Ap/a:顯示am或pm。
可根據(jù)實際顯示需要進行格式設置,例如:

hh:mm:ss A      22:30:08  PM
H:mm:s a        10:30:8  pm

QTime的toString()函數(shù)也可直接利用Qt::DateFormat作為參數(shù)指定時間顯示的格式,如Qt::TextDate、Qt::ISODate、Qt::LocaleDate等。

4.10 可擴展對話框

可擴展對話框的基本實現(xiàn)方法是利用setSizeConstraint(QLayout::SetFixedSize)方法使對話框尺寸保持相對固定。其中,最關鍵的部分有以下兩點。
? 在整個對話框的構造函數(shù)中調用。

layout->setSizeConstraint(QLayout::SetFixedSize);

這個設置保證了對話框的尺寸保持相對固定,始終保持各個控件組合的默認尺寸。
? 切換按鈕的實現(xiàn)。整個窗體可擴展的工作都是在此按鈕所連接的槽函數(shù)中完成的。
【例】(難度一般)(CH406)簡單地填寫資料。通常情況下,只需填寫姓名和性別。若有特殊需要,還需填寫更多信息時,則切換至完整對話窗體,運行效果如圖4.13所示。
Qt5開發(fā)及實例V2.0-第四章Qt基本對話框,QT5,ARM?MCU,Linux,qt,數(shù)據(jù)庫,服務器,嵌入式硬件,開發(fā)語言,運維
實現(xiàn)步驟如下。
(1)新建Qt Widgets Application(詳見1.3.1節(jié)),項目名稱為“ExtensionDlg”,基類選擇“QDialog”,類名命名為“ExtensionDlg”,取消“創(chuàng)建界面”復選框的選中狀態(tài)。單擊“下一步”按鈕,最后單擊“完成”按鈕,完成該項目工程的建立。
(2)ExtensionDlg類繼承自QDialog,打開“extensiondlg.h”頭文件,具體代碼如下:

#include <QDialog>
class ExtensionDlg : public QDialog
{
    	Q_OBJECT
public:
    	ExtensionDlg(QWidget *parent = 0);
    	~ExtensionDlg();
private slots:
    	void showDetailInfo();
private:
    	void createBaseInfo();           		//實現(xiàn)基本對話窗體部分
    	void createDetailInfo();            		//實現(xiàn)擴展窗體部分
    	QWidget *baseWidget;                  	//基本對話窗體部分
    	QWidget *detailWidget;            	//擴展窗體部分
};

(3)打開“extensiondlg.cpp”源文件,添加以下代碼:

#include <QVBoxLayout>
#include <QLabel>
#include <QLineEdit>
#include <QComboBox>
#include <QPushButton>
#include <QDialogButtonBox>
#include <QHBoxLayout>
ExtensionDlg::ExtensionDlg(QWidget *parent)
    : QDialog(parent)
{
    	setWindowTitle(tr("Extension Dialog"));	 //設置對話框的標題欄信息
    	createBaseInfo();
    	createDetailInfo();
    	QVBoxLayout *layout =new QVBoxLayout(this);		//布局
    	layout->addWidget(baseWidget);
    	layout->addWidget(detailWidget);
    	layout->setSizeConstraint(QLayout::SetFixedSize);	//(a)
    	layout->setSpacing(10);
}

createBaseInfo()函數(shù)完成基本信息窗體部分的構建,其中,連接實現(xiàn)切換功能的“詳細”按鈕DetailBtn的clicked()信號與槽函數(shù)showDetailInfo()以便實現(xiàn)對話框的可擴展,其具體實現(xiàn)代碼。
createDetailInfo()函數(shù)實現(xiàn)詳細信息窗體部分detailWidget的構建,并在函數(shù)的最后調用hide()隱藏此部分窗體,實現(xiàn)代碼。

showDetailInfo()函數(shù)完成窗體擴展切換工作,在用戶單擊DetailBtn時調用此函數(shù),首先檢測detailWidget窗體處于何種狀態(tài)。若此時是隱藏狀態(tài),則應用show()函數(shù)顯示detailWidget窗體,否則調用hide()函數(shù)隱藏detailWidget窗體。其具體實現(xiàn)代碼如下:

void ExtensionDlg::showDetailInfo()
{
    	if(detailWidget->isHidden())
    	   detailWidget->show();
    	else detailWidget->hide();
}

(4)運行程序,顯示效果如圖4.13所示。

4.11 不規(guī)則窗體

【例】(簡單)(CH407)不規(guī)則窗體的實現(xiàn)方法。具體實現(xiàn)一個蝴蝶圖形外沿形狀的不規(guī)則形狀對話框,也可以在不規(guī)則窗體上放置按鈕等控件,可以通過鼠標左鍵拖曳窗體,單擊鼠標右鍵關閉窗體。運行效果如圖4.14所示。
Qt5開發(fā)及實例V2.0-第四章Qt基本對話框,QT5,ARM?MCU,Linux,qt,數(shù)據(jù)庫,服務器,嵌入式硬件,開發(fā)語言,運維
實現(xiàn)步驟如下。
(1)新建Qt Widgets Application(詳見1.3.1節(jié)),項目名稱為“ShapeWidget”,基類選擇“QWidget”,類名命名為“ShapeWidget”,取消“創(chuàng)建界面”復選框的選中狀態(tài)。單擊“下一步”按鈕,最后單擊“完成”按鈕,完成該項目工程的建立。
(2)不規(guī)則窗體類ShapeWidget繼承自QWidget類,為了使不規(guī)則窗體能夠通過鼠標隨意拖曳,在該類中重定義了鼠標事件mousePressEvent()、mouseMoveEvent()及繪制函數(shù)paintEvent(),打開“shapewidget.h”頭文件,添加如下代碼:

class ShapeWidget : public QWidget
{
	Q_OBJECT
public:
	ShapeWidget(QWidget *parent = 0);
	~ShapeWidget();
protected:
    	void mousePressEvent(QMouseEvent *);
    	void mouseMoveEvent(QMouseEvent *);
    	void paintEvent(QPaintEvent *);
private:
	QPoint dragPosition;
};

(3)打開“shapewidget.cpp”文件,ShapeWidget的構造函數(shù)部分是實現(xiàn)不規(guī)則窗體的關鍵,添加的具體代碼如下:
//添加的頭文件

#include <QMouseEvent>
#include <QPainter>
#include <QPixmap>
#include <QBitmap>
ShapeWidget::ShapeWidget(QWidget *parent)
    : QWidget(parent)
{
    QPixmap pix;			//新建一個QPixmap對象
    pix.load("16.png",0,Qt::AvoidDither|Qt::ThresholdDither|Qt:: ThresholdAlphaDither);					//(a)
    resize(pix.size());			//(b)
    setMask(QBitmap(pix.mask()));		//(c)
}

load()函數(shù)的原型如下:

bool QPixmap::load ( const QString & fileName, const char * format = 0, Qt::ImageConversionFlags flags = Qt::AutoColor )

鼠標移動響應函數(shù)mouseMoveEvent(QMouseEvent *),首先判斷當前鼠標狀態(tài),調用event->buttons()返回鼠標的狀態(tài),若為左鍵則調用QWidget的move()函數(shù)將窗體移動至鼠標當前點。由于move()函數(shù)的參數(shù)指的是窗體的左上角的位置,因此要使用鼠標當前點的位置減去相對窗體左上角的偏移值dragPosition。具體的實現(xiàn)代碼。
重畫函數(shù)paintEvent()主要完成在窗體上繪制圖片的工作。此處為方便顯示在窗體上繪制的是用來確定窗體外形的PNG圖片。具體實現(xiàn)代碼如下:

void ShapeWidget::paintEvent(QPaintEvent *event)
{
	QPainter painter(this);
	painter.drawPixmap(0,0,QPixmap("16.png"));
}

(4)選擇“構建”→“構建項目"ShapeWidget"”菜單項,將事先準備的圖片16.png復制到項目D:\Qt\CH4\CH407\build-ShapeWidget-Desktop_Qt_5_8_0_MinGW_32bit-Debug目錄下,重啟Qt 5.8開發(fā)工具后重新構建、運行程序,顯示效果如圖4.14所示。

4.12 程序啟動畫面(QSplashScreen)

【例】(簡單)(CH408)程序啟動畫面(QSplashScreen)的使用方法。當運行程序時,在顯示屏的中央出現(xiàn)一個啟動畫面,經(jīng)過一段時間,應用程序完成初始化工作后,啟動畫面隱去,出現(xiàn)程序的主窗口界面。
實現(xiàn)方法如下。
(1)新建Qt Widgets Application(詳見1.3.1節(jié)),項目名稱為“SplashSreen”,基類選擇“QMainWindow”,類名命名為“MainWindow”,取消“創(chuàng)建界面”復選框的選中狀態(tài)。單擊“下一步”按鈕,最后單擊“完成”按鈕,完成該項目工程的建立。
(2)主窗體MainWindow類繼承自QMainWindow類,模擬一個程序的啟動,打開“mainwindow.h”頭文件,自動生成的代碼如下:

#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
class MainWindow : public QMainWindow
{
    Q_OBJECT
public:
    MainWindow(QWidget *parent = 0);
    ~MainWindow();
};
#endif // MAINWINDOW_H

(3)打開“mainwindow.cpp”源文件,添加如下代碼:
//添加的頭文件

#include <QTextEdit>
#include <windows.h>
MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
{
    setWindowTitle("Splash Example");
    QTextEdit *edit=new QTextEdit;
    edit->setText("Splash Example!");
    setCentralWidget(edit);
    resize(600,450);
    Sleep(1000);								//(a)
}

(4)啟動畫面主要在main()函數(shù)中實現(xiàn),打開“main.cpp”文件,添加以下加黑代碼:

#include "mainwindow.h"
#include <QApplication>
#include <QPixmap>
#include <QSplashScreen>
int main(int argc, char *argv[])
{
    	QApplication a(argc, argv);			//創(chuàng)建一個QApplication對象
    	QPixmap pixmap("Qt.png");				//(a)
    	QSplashScreen splash(pixmap);			//(b)
    	splash.show();					//顯示此啟動圖片
    	a.processEvents();					//(c)
    	MainWindow w;					//(d)
    	w.show();
    	splash.finish(&w);					//(e)
   	return a.exec();
}

其中,
(a) QPixmap pixmap(“Qt.png”):創(chuàng)建一個QPixmap對象,設置啟動圖片(這里設置為Qt的圖標“Qt.png”)。
(b) QSplashScreen splash(pixmap):利用QPixmap對象創(chuàng)建一個QSplashScreen對象。
? a.processEvents():使程序在顯示啟動畫面的同時仍能響應鼠標等其他事件。
(d) MainWindow w、w.show():正常創(chuàng)建主窗體對象,并調用show()函數(shù)顯示。
(e) splash.finish(&w):表示在主窗體對象初始化完成后,結束啟動畫面。

(5)選擇“構建”→“構建項目"SplashSreen"”菜單項,將事先準備好的圖片Qt.png復制到項目D:\Qt\CH4\CH408\build-SplashSreen-Desktop_Qt_5_8_0_MinGW_32bit-Debug目錄下,運行程序,啟動效果如圖4.15所示。

Qt5開發(fā)及實例V2.0-第四章Qt基本對話框,QT5,ARM?MCU,Linux,qt,數(shù)據(jù)庫,服務器,嵌入式硬件,開發(fā)語言,運維



本章相關例程源碼下載

1.Qt5開發(fā)及實例_CH401.rar 下載

Qt5開發(fā)及實例_CH401.rar

2.Qt5開發(fā)及實例_CH402.rar 下載

Qt5開發(fā)及實例_CH402.rar

3.Qt5開發(fā)及實例_CH403.rar 下載

Qt5開發(fā)及實例_CH403.rar

4.Qt5開發(fā)及實例_CH404.rar 下載

Qt5開發(fā)及實例_CH404.rar

5.Qt5開發(fā)及實例_CH405.rar 下載

Qt5開發(fā)及實例_CH405.rar

6.Qt5開發(fā)及實例_CH406.rar 下載

Qt5開發(fā)及實例_CH406.rar

7.Qt5開發(fā)及實例_CH407.rar 下載

Qt5開發(fā)及實例_CH407.rar

8.Qt5開發(fā)及實例_CH408.rar 下載

Qt5開發(fā)及實例_CH408.rar文章來源地址http://www.zghlxwxcb.cn/news/detail-732957.html

到了這里,關于Qt5開發(fā)及實例V2.0-第四章Qt基本對話框的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如若轉載,請注明出處: 如若內容造成侵權/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領支付寶紅包贊助服務器費用

相關文章

  • spark第四章:SparkSQL基本操作

    spark第四章:SparkSQL基本操作

    spark第一章:環(huán)境安裝 spark第二章:sparkcore實例 spark第三章:工程化代碼 spark第四章:SparkSQL基本操作 接下來我們學習SparkSQL他和Hql有些相似。Hql是將操作裝換成MR,SparkSQL也是,不過是使用Spark引擎來操作,效率更高一些 以上是這次博客需要的所有依賴,一次性全加上。 一共

    2024年02月07日
    瀏覽(31)
  • 【考研數(shù)學】線性代數(shù)第四章 —— 線性方程組(1,基本概念 | 基本定理 | 解的結構)

    【考研數(shù)學】線性代數(shù)第四章 —— 線性方程組(1,基本概念 | 基本定理 | 解的結構)

    繼向量的學習后,一鼓作氣,把線性方程組也解決了去。O.O 方程組 稱為 n n n 元齊次線性方程組。 方程組 稱為 n n n 元非齊次線性方程組。 方程組(I)又稱為方程組(II)對應的齊次線性方程組或導出方程組。 方程組(I)和方程組(II)分別稱為齊次線性方程組和非齊次線

    2024年02月11日
    瀏覽(33)
  • 第四章認識Node.js模塊化開發(fā)

    Node.js系統(tǒng)模塊 續(xù)上一篇文章第三章認識Node.js模塊化開發(fā)-CSDN博客,這次繼續(xù)來認識和總結以下node的常用模塊開發(fā) Node.js系統(tǒng)模塊是指Node.js自帶的一些模塊,這些模塊可以直接在Node.js中使用,無需安裝其他包。以下是常用的Node.js系統(tǒng)模塊: fs模塊:用于處理文件系統(tǒng)。 htt

    2024年02月08日
    瀏覽(24)
  • 【云計算與虛擬化】第四章 實驗二 vCenter Server網(wǎng)絡部署及基本操作

    【云計算與虛擬化】第四章 實驗二 vCenter Server網(wǎng)絡部署及基本操作

    實驗二 ???vCenter Server網(wǎng)絡部署及基本操作 一、實驗內容 通過vSphere client 客戶端登陸vCenter服務器,為新建的虛擬機Windows7 激活,并修改計算機名為姓名拼音的首字母-學號 通過vSphere client 客戶端登陸vCenter服務器,將虛擬機windows7的cpu和內存設置為可以熱插拔 通過vSphere clie

    2024年04月22日
    瀏覽(25)
  • 第四章 應用SysML基本特性集的汽車示例 P1|系統(tǒng)建模語言SysML實用指南學習

    第四章 應用SysML基本特性集的汽車示例 P1|系統(tǒng)建模語言SysML實用指南學習

    僅供個人學習記錄 主要就是應用練習建模了 Automobile Domain包 將模型組織入包的包圖 汽車規(guī)范中包含系統(tǒng)需求的需求圖 汽車域塊定義圖 描述車輛主要功能的用例圖

    2024年02月06日
    瀏覽(22)
  • 微信小程序開發(fā)實戰(zhàn)課后習題解答————第四章(作業(yè)版)

    一、填空題 1、 ?組件? 是視圖層的基本組成單元。 2、 swiper內部只可以放置 ? swiper-item? ? 組件。 3、 設置text文本內容長按可選的屬性是? ?selectable ? 。? ? 4、navigator組件通過設置? ?open-type? ? 屬性,來區(qū)分不同的跳轉功能。 5、通過image的? mode? ? 屬性來設定不同的圖

    2024年02月06日
    瀏覽(31)
  • 全文檢索工具elasticsearch:第四章:開發(fā)電商的搜索列表功能

    全文檢索工具elasticsearch:第四章:開發(fā)電商的搜索列表功能

    // skuInfo轉化成skuLsInfo for (SkuInfo skuInfo : skuInfos) { SkuLsInfo skuLsInfo = new SkuLsInfo(); BeanUtils.copyProperties(skuInfo,skuLsInfo); // 將skuLsInfo導入到es中 Index index = new Index.Builder(skuLsInfo).index(“gmall”).type(“SkuLsInfo”).id(skuLsInfo.getId()).build(); jestClient.execute(index); } } } @Override public List SkuListByCat

    2024年04月09日
    瀏覽(22)
  • 使用 GPT4 和 ChatGPT 開發(fā)應用:第四章到第五章

    使用 GPT4 和 ChatGPT 開發(fā)應用:第四章到第五章

    原文:Developing Apps with GPT-4 and ChatGPT 譯者:飛龍 協(xié)議:CC BY-NC-SA 4.0 現(xiàn)在你已經(jīng)熟悉了 LLM 的基礎知識和 OpenAI API,是時候將你的技能提升到下一個水平了。本章涵蓋了強大的策略,將使你能夠充分利用 ChatGPT 和 GPT-4 的潛力。從提示工程、零-shot 學習和少-shot 學習到為特定任務

    2024年01月21日
    瀏覽(56)
  • 【期末不掛科-單片機考前速過系列P4】(第四章:32題搞定基本指令例題)經(jīng)典例題盤點(帶圖解析)

    【期末不掛科-單片機考前速過系列P4】(第四章:32題搞定基本指令例題)經(jīng)典例題盤點(帶圖解析)

    前言 大家好吖,歡迎來到 YY 滴單片機系列 ,熱烈歡迎! 本章主要內容面向接觸過單片機的老鐵 主要內容含: 歡迎訂閱 YY 滴C++專欄!更多干貨持續(xù)更新!以下是傳送門! YY的《C++》專欄 YY的《C++11》專欄 YY的《Linux》專欄 YY的《數(shù)據(jù)結構》專欄 YY的《C語言基礎》專欄 YY的《

    2024年02月02日
    瀏覽(22)
  • 《Linux操作系統(tǒng)編程》第四章 屏幕編程器vi : 了解屏幕編輯器vi的概述和基本操作命令

    《Linux操作系統(tǒng)編程》第四章 屏幕編程器vi : 了解屏幕編輯器vi的概述和基本操作命令

    ???? 博主 libin9iOak帶您 Go to New World.??? ?? 個人主頁——libin9iOak的博客?? ?? 《面試題大全》 文章圖文并茂??生動形象??簡單易學!歡迎大家來踩踩~?? ?? 《IDEA開發(fā)秘籍》學會IDEA常用操作,工作效率翻倍~?? ???? 希望本文能夠給您帶來一定的幫助??文章粗淺,敬

    2024年02月11日
    瀏覽(20)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領取紅包,優(yōu)惠每天領

二維碼1

領取紅包

二維碼2

領紅包