在上一篇博文 《C/C++ Qt 標准Dialog對話框組件應用》 中我給大家演示了如何使用Qt中內置的標准對話框組件實現基本的數據輸入功能。

但有時候我們需要一次性修改多個數據,使用默認的模態對話框似乎不太够用,此時我們需要自己創建一個自定義對話框,這類對話框也是一種窗體,所以可以在其上面放置任何的通用組件,以實現更多複雜的開發需求。

目前自定義對話框與主窗體的通信有兩種方式,一種是通過函數實現通信,另一種則是通過信號實現通信,我們以通過函數通信為基礎,解釋一下如何實現跨窗體通信。

首先需要創建一個自定義對話框,對話框具體創建流程如下

  • 選擇項目 -> AddNew -> QT -> Qt設計師界面類 -> 選擇空白Dialog -> 命名為Dialog保存

直接選中Dianlog.ui並繪制界面為以下,一個編輯框,兩個按鈕。

其次需要在Dialog對話框上增加兩個信號,分別是點擊關閉,並將信號關聯到兩個槽函數上,其信號應該寫成如下樣子。

接著我們點開dialog.cpp這個類則是對話框類,類內需要定義兩個成員函數,它們的功能如下:

  • 第一個 GetValue() 用來獲取當前編輯框內的數據並將數據返回給父窗體。
  • 第二個 SetValue() 用來接收傳入的參數,並將此參數設置到自身窗體中的編輯框內。
#include "dialog.h"
#include "ui_dialog.h" Dialog::Dialog(QWidget *parent) :QDialog(parent),ui(new Ui::Dialog)
{
ui->setupUi(this);
} // 用於MainWindow獲取編輯框中的數據
QString Dialog::GetValue()
{
return ui->lineEdit->text();
} // 用於設置當前編輯框中的數據為MainWindow
// https://www.cnblogs.com/lyshark
void Dialog::SetValue(QString x)
{
ui->lineEdit->setText(x);
} Dialog::~Dialog()
{
delete ui;
} void Dialog::on_BtnOk_clicked()
{ }
void Dialog::on_BtnCancel_clicked()
{ }

對於主函數來說,當用戶點擊on_pushButton_clicked()按鈕時,我們需要動態將自己創建的Dialog加載,讀取出主窗體編輯框內的值並設置到子窗體內,當用戶按下QDialog::Accepted時則是獲取子窗體內的值,並將其設置到父窗體的編輯框內,主函數代碼如下所示.

#include "mainwindow.h"
#include "ui_mainwindow.h" #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;
} // By: LyShark
// https://www.cnblogs.com/lyshark
// 按鈕點擊後執行
void MainWindow::on_pushButton_clicked()
{
// 創建模態對話框
Dialog *ptr = new Dialog(this); // 創建一個對話框
Qt::WindowFlags flags = ptr->windowFlags(); // 需要獲取返回值
ptr->setWindowFlags(flags | Qt::MSWindowsFixedSizeDialogHint); // 設置對話框固定大小 // 讀取MainWindows參數並設置到Dialog
QString item = ui->lineEdit->text();
ptr->SetValue(item); int ref = ptr->exec(); // 以模態方式顯示對話框
if (ref==QDialog::Accepted) // OK鍵被按下,對話框關閉
{
// 當BtnOk被按下時,則設置對話框中的數據
QString the_value = ptr->GetValue();
std::cout << "value = " << the_value.toStdString().data() << std::endl;
ui->lineEdit->setText(the_value);
} // 删除釋放對話框句柄
delete ptr;
}

具體演示代碼如下所示:

而對於信號版來說,我們需要在dialog.h頭文件中增加sendText()信號,以及on_pushButton_clicked()槽函數的聲明。

#ifndef DIALOG_H
#define DIALOG_H #include <QDialog> namespace Ui {
class Dialog;
} class Dialog : public QDialog
{
Q_OBJECT public:
explicit Dialog(QWidget *parent = nullptr);
~Dialog(); // By: LyShark
// https://www.cnblogs.com/lyshark
private:
Ui::Dialog *ui; // 定義信號(信號只需聲明無需實現)
signals:
void sendText(QString str); private slots:
void on_pushButton_clicked();
}; #endif // DIALOG_H

dialog.cpp中則在構造函數中建立連接,並提供一個發送到MainWindow中的按鈕.

#include "dialog.h"
#include "ui_dialog.h" // By: LyShark
// https://www.cnblogs.com/lyshark
Dialog::Dialog(QWidget *parent) :QDialog(parent),ui(new Ui::Dialog)
{
ui->setupUi(this);
connect(ui->pushButton, SIGNAL(clicked()), this, SLOT(onBtnClick()));
} Dialog::~Dialog()
{
delete ui;
} // 發送信號到MainWindow
void Dialog::on_pushButton_clicked()
{
QString send_data = ui->lineEdit->text();
emit sendText(send_data);
}

主窗體頭文件mainwindow.h中定義receiveMsg接受數據的槽函數.

#ifndef MAINWINDOW_H
#define MAINWINDOW_H #include <QMainWindow> namespace Ui {
class MainWindow;
} class MainWindow : public QMainWindow
{
Q_OBJECT public:
explicit MainWindow(QWidget *parent = nullptr);
~MainWindow(); // By: LyShark
// https://www.cnblogs.com/lyshark
private slots:
// 定義槽函數
void receiveMsg(QString str);
void on_pushButton_clicked(); private:
Ui::MainWindow *ui;
}; #endif // MAINWINDOW_H

並在mainwindow.cpp中實現這個槽函數。

#include "mainwindow.h"
#include "ui_mainwindow.h" #include "dialog.h"
#include <QDialog> // By: LyShark
// https://www.cnblogs.com/lyshark
MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent),ui(new Ui::MainWindow)
{
ui->setupUi(this);
ui->lineEdit->setEnabled(false);
} // 接收信號並設置到LineEdit上
void MainWindow::receiveMsg(QString str)
{
ui->lineEdit->setText(str);
} MainWindow::~MainWindow()
{
delete ui;
} void MainWindow::on_pushButton_clicked()
{
Dialog *subwindow = new Dialog(this);
// 當收到sendText信號時使用receiveMsg槽函數處理
connect(subwindow, SIGNAL(sendText(QString)), this, SLOT(receiveMsg(QString)));
subwindow->show();
}

代碼運行後與基於函數版的基本一致,但在靈活性上來說信號版更好一些。

C/C++ Qt 自定義Dialog對話框組件應用的更多相關文章

  1. Android中制作自定義dialog對話框的實例

    http://www.jb51.net/article/83319.htm   這篇文章主要介紹了Android中制作自定義dialog對話框的實例分享,安卓自帶的Dialog顯然不够用,因而我們要繼 ...

  2. 第二百零四節,jQuery EasyUI,Dialog(對話框)組件

    jQuery EasyUI,Dialog(對話框)組件 學習要點: 1.加載方式 2.屬性列錶 3.事件列錶 4.方法列錶 本節課重點了解EasyUI中Dialog(窗口)組件的使用方法,這個組件依賴 ...

  3. Taro自定義Modal對話框組件|taro仿微信、android彈窗

    基於Taro多端實踐TaroPop:自定義模態框|dialog對話框|msg消息框|Toast提示 taro自定義彈出框支持編譯到多端H5/小程序/ReactNative,還可以自定義彈窗類型/彈窗樣 ...

  4. Android自定義 Dialog 對話框

    Android自定義Dialoghttp://www.cnblogs.com/and_he/archive/2011/09/16/2178716.html Android使用自定義AlertDialo ...

  5. Dialog( 對話框) 組件

    一. 加載方式//class 加載方式<div class="easyui-dialog" title="My Dialog"style="wi ...

  6. QT 自定義模態對話框

    新建一個MsgBox類 msgbox.h 代碼 #ifndef MSGBOX_H #define MSGBOX_H #include <QDialog> #include <QPus ...

  7. Java Swing 自定義Dialog確認對話框

    Java Swing 自定義Dialog 需求:當點擊JFrame窗口的關閉按鈕時,彈框詢問是否確定關閉窗口,如果是則關閉程序,否就讓彈框消失什麼也不做(使用Dialog). 分析:雖然Java提供了 ...

  8. 關於Element對話框組件Dialog在使用時的一些問題及解决辦法

    Element對話框組件Dialog在我們的實際項目開發中可以說是一個使用頻率較高的組件,它能為我們展示提示的功能,如:業務模塊提交前展示我們曾經輸入或選擇過的業務信息,或者展示列錶信息中某項業務的具 ...

  9. 基於React.js網頁版彈窗|react pc端自定義對話框組件RLayer

    基於React.js實現PC桌面端自定義彈窗組件RLayer. 前幾天有分享一個Vue網頁版彈框組件,今天分享一個最新開發的React PC桌面端自定義對話框組件. RLayer 一款基於react. ...

  10. Android自定義Dialog多選對話框(Dialog+Listview+CheckBox)

    先放效果截圖 項目中需要有個Dialog全選對話框,點擊全選全部選中,取消全選全部取消.下午查了些資料,重寫了一下Dialog對話框.把代碼放出來. public class MainActivity ...

隨機推薦

  1. 關於gitignore文件的創建與使用

    在我們使用github提交本地代碼時,有些庫文件和日志文件是不必要提交的,那如何處理這個問題呢?這個時候我們就會用到.gitignore文件了. 該篇博客我會介紹如何創建.gitignore,以及如何 ...

  2. 【CSS】過渡、動畫和變換

    1. 使用過渡 過渡效果一般是由瀏覽器直接改變元素的CSS屬性實現的.例如,如果使用:hover選擇器,一旦用戶將鼠標懸停在元素之上,瀏覽器就會應用跟選擇器關聯的屬性. <!DOCTYPE ht ...

  3. UML Sequence sample: if-else

    if (balance >= amount) { ... } else { ... }

  4. spi接口的ds1302時鐘芯片控制在lcd1602上顯示

    spi接口的ds1302時鐘芯片控制在lcd1602上顯示                                                                        ...

  5. C#值數值類型轉換

    1.十進制轉16進制 string result=number.ToString("X2"); >>0A //X2錶示大寫2比特 2.字符串轉數值類型 "); ...

  6. A-B 練習【大數减法舉例】

      A-B Time Limit: 1000ms   Memory limit: 65536K  有疑問?點這裏^_^ 題目描述 題目鏈接:http://acm.sdut.edu.cn/sdutoj/ ...

  7. iOS之微博UI實例--擬物化設計(成功了90%)

    *:first-child { margin-top: 0 !important; } body > *:last-child { margin-bottom: 0 !important; } ...

  8. ArrayList實現分組功能

    這邊只用2個屬性來進行分組 定義Object有key與value屬性 按照key的不同對於arrayList進行分組 List<Object> tempList=new ArrayList ...

  9. Android sdk下載找不到support library

    沒有android support library下載項. 找了很多資料,發現 android support library 被Google廢弃了,不推薦使用.代替使用的是 android supp ...

  10. Nginx系列二:(Nginx Rewrite 規則、Nginx 防盜鏈、Nginx 動靜分離、Nginx+keepalived 實現高可用)

    一.Nginx Rewrite 規則 1. Nginx rewrite規則 Rewrite規則含義就是某個URL重寫成特定的URL(類似於Redirect),從某種意義上說為了美觀或者對搜索引擎友好, ...