Qt 是一個(gè)跨平臺(tái)C++圖形界面開發(fā)庫(kù),利用Qt可以快速開發(fā)跨平臺(tái)窗體應(yīng)用程序,在Qt中我們可以通過(guò)拖拽的方式將不同組件放到指定的位置,實(shí)現(xiàn)圖形化開發(fā)極大的方便了開發(fā)效率,本章將重點(diǎn)介紹自定義Dialog
組件的常用方法及靈活運(yùn)用。
在之前的文章中筆者已經(jīng)為大家展示了默認(rèn)Dialog
組件的使用方法,雖然內(nèi)置組件支持對(duì)數(shù)據(jù)的輸入,但有時(shí)候我們需要一次性輸入多個(gè)數(shù)據(jù),此時(shí)如果之使用默認(rèn)模態(tài)對(duì)話框似乎不太夠用,此時(shí)我們需要自己創(chuàng)建一個(gè)自定義對(duì)話框,需要說(shuō)明的是此類對(duì)話框也是一種窗體,所以可以在其上面放置任何通用組件,以實(shí)現(xiàn)更多復(fù)雜的開發(fā)需求。
自定義對(duì)話框需要解決的問(wèn)題是,如何讓父窗體與子窗體進(jìn)行數(shù)據(jù)交換,要實(shí)現(xiàn)數(shù)據(jù)的交換有兩種方式,第一種方式是通過(guò)動(dòng)態(tài)加載模態(tài)對(duì)話框,當(dāng)用戶點(diǎn)擊確定后通過(guò)GetValue()
來(lái)拿到數(shù)據(jù),而第二種方式則是通過(guò)發(fā)送信號(hào)的方式將數(shù)據(jù)投遞給父窗體,這兩種方式都可以,讀者可根據(jù)自身需求來(lái)選擇不同的通信方式。
1.1 使用模態(tài)對(duì)話框傳值
首先我們需要?jiǎng)?chuàng)建一個(gè)自定義對(duì)話框,在Qt中創(chuàng)建對(duì)話框很容易,具體創(chuàng)建流程如下所示:
- 選擇項(xiàng)目 -> AddNew -> QT -> Qt設(shè)計(jì)師界面類 -> 選擇DialogWithoutButtons -> 命名為Dialog保存
此時(shí)直接點(diǎn)擊下一步按鈕,并選中Forms/dialog.ui
界面編輯菜單,在編輯欄中我們分別增加一個(gè)LineEdit
編輯框,以及兩個(gè)PushButton
按鈕組件,將第一個(gè)組件命名為BtnOk
將第二個(gè)組件命名為BtnCancel
,界面如下所示;
當(dāng)做完頁(yè)面布局后,其次我們還需要在Dialog.ui
組件上增加兩個(gè)信號(hào),分別是點(diǎn)擊
和關(guān)閉
,并將信號(hào)關(guān)聯(lián)到兩個(gè)槽函數(shù)上,其信號(hào)應(yīng)該寫成如下圖所示。
如上圖,accept()
是 QDialog
類的一個(gè)公共槽函數(shù)。調(diào)用這個(gè)槽函數(shù)會(huì)觸發(fā)對(duì)話框的接受(accept)操作,通常用于模擬用戶點(diǎn)擊對(duì)話框的“確定”按鈕。同樣的reject()
也是 QDialog
類的一個(gè)公共槽函數(shù)。調(diào)用這個(gè)槽函數(shù)會(huì)觸發(fā)對(duì)話框的拒絕(reject)操作,通常用于模擬用戶點(diǎn)擊對(duì)話框的“取消”按鈕。
接著我們點(diǎn)開模態(tài)對(duì)話框的dialog.cpp
對(duì)話框類,其類內(nèi)需要定義兩個(gè)成員函數(shù),它們的功能如下:
- 第一個(gè)
GetValue()
用來(lái)獲取當(dāng)前編輯框內(nèi)的數(shù)據(jù)并將數(shù)據(jù)返回給父窗體。 - 第二個(gè)
SetValue()
用來(lái)接收傳入的參數(shù),并將此參數(shù)設(shè)置到自身窗體中的編輯框內(nèi)。
#include "dialog.h"
#include "ui_dialog.h"
Dialog::Dialog(QWidget *parent) :QDialog(parent),ui(new Ui::Dialog)
{
ui->setupUi(this);
}
// 用于MainWindow獲取編輯框中的數(shù)據(jù)
QString Dialog::GetValue()
{
return ui->lineEdit->text();
}
// 用于設(shè)置當(dāng)前編輯框中的數(shù)據(jù)為MainWindow
void Dialog::SetValue(QString x)
{
ui->lineEdit->setText(x);
}
Dialog::~Dialog()
{
delete ui;
}
接著我們來(lái)看一下MainWindow
函數(shù)中是如何接收參數(shù)的,對(duì)于主窗體來(lái)說(shuō),當(dāng)用戶點(diǎn)擊on_pushButton_clicked()
按鈕時(shí),我們需要?jiǎng)討B(tài)將自己創(chuàng)建的Dialog
加載,讀取出主窗體編輯框內(nèi)的值并設(shè)置到子窗體內(nèi),當(dāng)用戶按下QDialog::Accepted
時(shí)則是獲取子窗體內(nèi)的值,此時(shí)通過(guò)調(diào)用ptr->GetValue()
子窗體的成員函數(shù)來(lái)返回一個(gè)字符串,并將其設(shè)置到父窗體的編輯框內(nèi),主函數(shù)代碼如下所示;
// 首先要包含Dialog對(duì)話框類
#include "dialog.h"
#include <iostream>
#include <QDialog>
MainWindow::MainWindow(QWidget *parent) :QMainWindow(parent),ui(new Ui::MainWindow)
{
ui->setupUi(this);
ui->lineEdit->setEnabled(false);
ui->lineEdit->setText("hello lyshark");
}
MainWindow::~MainWindow()
{
delete ui;
}
// 按鈕點(diǎn)擊后執(zhí)行
void MainWindow::on_pushButton_clicked()
{
// 創(chuàng)建模態(tài)對(duì)話框
Dialog *ptr = new Dialog(this); // 創(chuàng)建一個(gè)對(duì)話框
Qt::WindowFlags flags = ptr->windowFlags(); // 需要獲取返回值
ptr->setWindowFlags(flags | Qt::MSWindowsFixedSizeDialogHint); // 設(shè)置對(duì)話框固定大小
// 讀取MainWindows參數(shù)并設(shè)置到Dialog
QString item = ui->lineEdit->text();
ptr->SetValue(item);
int ref = ptr->exec(); // 以模態(tài)方式顯示對(duì)話框
if (ref==QDialog::Accepted) // OK鍵被按下,對(duì)話框關(guān)閉
{
// 當(dāng)BtnOk被按下時(shí),則設(shè)置對(duì)話框中的數(shù)據(jù)
QString the_value = ptr->GetValue();
std::cout << "value = " << the_value.toStdString().data() << std::endl;
ui->lineEdit->setText(the_value);
}
// 刪除釋放對(duì)話框句柄
delete ptr;
}
至此就實(shí)現(xiàn)了參數(shù)的子窗體傳遞到父窗體,如下圖所示;
2.1 使用信號(hào)傳值
對(duì)于信號(hào)傳值,我們需要在dialog.h
頭文件中增加sendText()
信號(hào),以及on_pushButton_clicked()
槽函數(shù)的聲明部分,如下所示;
// 定義信號(hào)(信號(hào)只需聲明無(wú)需實(shí)現(xiàn))
signals:
void sendText(QString str);
private slots:
void on_pushButton_clicked();
而在dialog.cpp
實(shí)現(xiàn)部分,我們首先需要將子窗體中的按鈕組件綁定到onBtnClick()
槽函數(shù)上面,當(dāng)需要發(fā)送數(shù)據(jù)時(shí)直接通過(guò)調(diào)用emit sendText
觸發(fā)信號(hào),并攜帶子窗體中send_data
的數(shù)據(jù);
#include "dialog.h"
#include "ui_dialog.h"
Dialog::Dialog(QWidget *parent) :QDialog(parent),ui(new Ui::Dialog)
{
ui->setupUi(this);
// 連接pushButton到onBtnClick上
connect(ui->pushButton, SIGNAL(clicked()), this, SLOT(onBtnClick()));
}
Dialog::~Dialog()
{
delete ui;
}
// 發(fā)送信號(hào)到MainWindow
void Dialog::on_pushButton_clicked()
{
QString send_data = ui->lineEdit->text();
emit sendText(send_data);
}
接著是在mainwindow.h
頭文件定義中,新增槽函數(shù)receiveMsg()
函數(shù)用來(lái)接收信號(hào)的傳值。
private slots:
// 定義槽函數(shù)
void receiveMsg(QString str);
void on_pushButton_clicked();
在mainwindow.cpp
實(shí)現(xiàn)部分,接收到信號(hào)后的槽函數(shù)receiveMsg
其內(nèi)部可以直接將參數(shù)設(shè)置到父類窗口的lineEdit
組件上,而當(dāng)on_pushButton_clicked
按鈕被點(diǎn)擊是,我們只需要加載自己的子窗體,并Connect
鏈接槽函數(shù)receiveMsg
上面,當(dāng)做完這一切之后,再通過(guò)subwindow->show()
讓子窗體顯示出來(lái)。
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "dialog.h"
#include <QDialog>
MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent),ui(new Ui::MainWindow)
{
ui->setupUi(this);
ui->lineEdit->setEnabled(false);
}
// 接收信號(hào)并設(shè)置到LineEdit上
void MainWindow::receiveMsg(QString str)
{
ui->lineEdit->setText(str);
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::on_pushButton_clicked()
{
Dialog *subwindow = new Dialog(this);
// 當(dāng)收到sendText信號(hào)時(shí)使用receiveMsg槽函數(shù)處理
connect(subwindow, SIGNAL(sendText(QString)), this, SLOT(receiveMsg(QString)));
subwindow->show();
}
當(dāng)然,此類對(duì)話框是非模態(tài)的,讀者可以拖動(dòng)父對(duì)話框,而由于是信號(hào)控制,所以當(dāng)發(fā)送參數(shù)到父窗體后,子窗體并不會(huì)立即關(guān)閉,如下圖所示;
文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-760173.html
完整案例下載文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-760173.html
到了這里,關(guān)于C++ Qt開發(fā):自定義Dialog對(duì)話框組件的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!