日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > windows >内容正文

windows

C++ Qt开发:自定义Dialog对话框组件

發(fā)布時間:2023/12/24 windows 26 coder
生活随笔 收集整理的這篇文章主要介紹了 C++ Qt开发:自定义Dialog对话框组件 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

Qt 是一個跨平臺C++圖形界面開發(fā)庫,利用Qt可以快速開發(fā)跨平臺窗體應(yīng)用程序,在Qt中我們可以通過拖拽的方式將不同組件放到指定的位置,實(shí)現(xiàn)圖形化開發(fā)極大的方便了開發(fā)效率,本章將重點(diǎn)介紹自定義Dialog組件的常用方法及靈活運(yùn)用。

在之前的文章中筆者已經(jīng)為大家展示了默認(rèn)Dialog組件的使用方法,雖然內(nèi)置組件支持對數(shù)據(jù)的輸入,但有時候我們需要一次性輸入多個數(shù)據(jù),此時如果之使用默認(rèn)模態(tài)對話框似乎不太夠用,此時我們需要自己創(chuàng)建一個自定義對話框,需要說明的是此類對話框也是一種窗體,所以可以在其上面放置任何通用組件,以實(shí)現(xiàn)更多復(fù)雜的開發(fā)需求。

自定義對話框需要解決的問題是,如何讓父窗體與子窗體進(jìn)行數(shù)據(jù)交換,要實(shí)現(xiàn)數(shù)據(jù)的交換有兩種方式,第一種方式是通過動態(tài)加載模態(tài)對話框,當(dāng)用戶點(diǎn)擊確定后通過GetValue()來拿到數(shù)據(jù),而第二種方式則是通過發(fā)送信號的方式將數(shù)據(jù)投遞給父窗體,這兩種方式都可以,讀者可根據(jù)自身需求來選擇不同的通信方式。

1.1 使用模態(tài)對話框傳值

首先我們需要創(chuàng)建一個自定義對話框,在Qt中創(chuàng)建對話框很容易,具體創(chuàng)建流程如下所示:

  • 選擇項(xiàng)目 -> AddNew -> QT -> Qt設(shè)計師界面類 -> 選擇DialogWithoutButtons -> 命名為Dialog保存

此時直接點(diǎn)擊下一步按鈕,并選中Forms/dialog.ui界面編輯菜單,在編輯欄中我們分別增加一個LineEdit編輯框,以及兩個PushButton按鈕組件,將第一個組件命名為BtnOk將第二個組件命名為BtnCancel,界面如下所示;

當(dāng)做完頁面布局后,其次我們還需要在Dialog.ui組件上增加兩個信號,分別是點(diǎn)擊關(guān)閉,并將信號關(guān)聯(lián)到兩個槽函數(shù)上,其信號應(yīng)該寫成如下圖所示。

如上圖,accept()QDialog 類的一個公共槽函數(shù)。調(diào)用這個槽函數(shù)會觸發(fā)對話框的接受(accept)操作,通常用于模擬用戶點(diǎn)擊對話框的“確定”按鈕。同樣的reject() 也是 QDialog 類的一個公共槽函數(shù)。調(diào)用這個槽函數(shù)會觸發(fā)對話框的拒絕(reject)操作,通常用于模擬用戶點(diǎn)擊對話框的“取消”按鈕。

接著我們點(diǎn)開模態(tài)對話框的dialog.cpp對話框類,其類內(nèi)需要定義兩個成員函數(shù),它們的功能如下:

  • 第一個 GetValue() 用來獲取當(dāng)前編輯框內(nèi)的數(shù)據(jù)并將數(shù)據(jù)返回給父窗體。
  • 第二個 SetValue() 用來接收傳入的參數(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;
}

接著我們來看一下MainWindow函數(shù)中是如何接收參數(shù)的,對于主窗體來說,當(dāng)用戶點(diǎn)擊on_pushButton_clicked()按鈕時,我們需要動態(tài)將自己創(chuàng)建的Dialog加載,讀取出主窗體編輯框內(nèi)的值并設(shè)置到子窗體內(nèi),當(dāng)用戶按下QDialog::Accepted時則是獲取子窗體內(nèi)的值,此時通過調(diào)用ptr->GetValue()子窗體的成員函數(shù)來返回一個字符串,并將其設(shè)置到父窗體的編輯框內(nèi),主函數(shù)代碼如下所示;

// 首先要包含Dialog對話框類
#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)對話框
    Dialog *ptr = new Dialog(this);                                 // 創(chuàng)建一個對話框
    Qt::WindowFlags flags = ptr->windowFlags();                     // 需要獲取返回值
    ptr->setWindowFlags(flags | Qt::MSWindowsFixedSizeDialogHint);  // 設(shè)置對話框固定大小

    // 讀取MainWindows參數(shù)并設(shè)置到Dialog
    QString item = ui->lineEdit->text();
    ptr->SetValue(item);

    int ref = ptr->exec();             // 以模態(tài)方式顯示對話框
    if (ref==QDialog::Accepted)        // OK鍵被按下,對話框關(guān)閉
    {
        // 當(dāng)BtnOk被按下時,則設(shè)置對話框中的數(shù)據(jù)
        QString the_value = ptr->GetValue();
        std::cout << "value = " << the_value.toStdString().data() << std::endl;
        ui->lineEdit->setText(the_value);
    }

    // 刪除釋放對話框句柄
    delete ptr;
}

至此就實(shí)現(xiàn)了參數(shù)的子窗體傳遞到父窗體,如下圖所示;

2.1 使用信號傳值

對于信號傳值,我們需要在dialog.h頭文件中增加sendText()信號,以及on_pushButton_clicked()槽函數(shù)的聲明部分,如下所示;

// 定義信號(信號只需聲明無需實(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ù)時直接通過調(diào)用emit sendText觸發(fā)信號,并攜帶子窗體中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ā)送信號到MainWindow
void Dialog::on_pushButton_clicked()
{
    QString send_data = ui->lineEdit->text();
    emit sendText(send_data);
}

接著是在mainwindow.h頭文件定義中,新增槽函數(shù)receiveMsg()函數(shù)用來接收信號的傳值。

private slots:
    // 定義槽函數(shù)
    void receiveMsg(QString str);
    void on_pushButton_clicked();

mainwindow.cpp實(shí)現(xiàn)部分,接收到信號后的槽函數(shù)receiveMsg其內(nèi)部可以直接將參數(shù)設(shè)置到父類窗口的lineEdit組件上,而當(dāng)on_pushButton_clicked按鈕被點(diǎn)擊是,我們只需要加載自己的子窗體,并Connect鏈接槽函數(shù)receiveMsg上面,當(dāng)做完這一切之后,再通過subwindow->show()讓子窗體顯示出來。

#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);
}

// 接收信號并設(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信號時使用receiveMsg槽函數(shù)處理
    connect(subwindow, SIGNAL(sendText(QString)), this, SLOT(receiveMsg(QString)));
    subwindow->show();
}

當(dāng)然,此類對話框是非模態(tài)的,讀者可以拖動父對話框,而由于是信號控制,所以當(dāng)發(fā)送參數(shù)到父窗體后,子窗體并不會立即關(guān)閉,如下圖所示;

完整案例下載

總結(jié)

以上是生活随笔為你收集整理的C++ Qt开发:自定义Dialog对话框组件的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。