一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - C/C++ - C/C++ Qt 自定義Dialog對話框組件應用案例詳解

C/C++ Qt 自定義Dialog對話框組件應用案例詳解

2022-03-06 18:09LyShark C/C++

有時候我們需要一次性修改多個數據,使用默認的模態對話框似乎不太夠用,此時我們需要自己創建一個自定義對話框。這篇文章主要介紹了Qt自定義Dialog對話框組件的應用,感興趣的同學可以學習一下

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

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

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

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

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

C/C++ Qt 自定義Dialog對話框組件應用案例詳解

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

C/C++ Qt 自定義Dialog對話框組件應用案例詳解

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

C/C++ Qt 自定義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;
}

具體演示代碼如下所示:

C/C++ Qt 自定義Dialog對話框組件應用案例詳解

而對于信號版來說,我們需要在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對話框組件應用案例詳解

自定義對話框基本就這些內容,靈活運行這些組件,很容易就能實現一些有用的表格編輯器。

C/C++ Qt 自定義Dialog對話框組件應用案例詳解

到此這篇關于C/C++ Qt 自定義Dialog對話框組件應用案例詳解的文章就介紹到這了,更多相關C++ Qt Dialog對話框組件內容請搜索服務器之家以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持服務器之家!

原文鏈接:https://www.cnblogs.com/LyShark/p/15603163.html

延伸 · 閱讀

精彩推薦
  • C/C++C語言實現電腦關機程序

    C語言實現電腦關機程序

    這篇文章主要為大家詳細介紹了C語言實現電腦關機程序,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下...

    xiaocaidayong8482021-08-20
  • C/C++c++ 單線程實現同時監聽多個端口

    c++ 單線程實現同時監聽多個端口

    這篇文章主要介紹了c++ 單線程實現同時監聽多個端口的方法,幫助大家更好的理解和學習使用c++,感興趣的朋友可以了解下...

    源之緣11542021-10-27
  • C/C++詳解c語言中的 strcpy和strncpy字符串函數使用

    詳解c語言中的 strcpy和strncpy字符串函數使用

    strcpy 和strcnpy函數是字符串復制函數。接下來通過本文給大家介紹c語言中的strcpy和strncpy字符串函數使用,感興趣的朋友跟隨小編要求看看吧...

    spring-go5642021-07-02
  • C/C++C++之重載 重定義與重寫用法詳解

    C++之重載 重定義與重寫用法詳解

    這篇文章主要介紹了C++之重載 重定義與重寫用法詳解,本篇文章通過簡要的案例,講解了該項技術的了解與使用,以下就是詳細內容,需要的朋友可以參考下...

    青山的青6062022-01-04
  • C/C++學習C++編程的必備軟件

    學習C++編程的必備軟件

    本文給大家分享的是作者在學習使用C++進行編程的時候所用到的一些常用的軟件,這里推薦給大家...

    謝恩銘10102021-05-08
  • C/C++C/C++經典實例之模擬計算器示例代碼

    C/C++經典實例之模擬計算器示例代碼

    最近在看到的一個需求,本以為比較簡單,但花了不少時間,所以下面這篇文章主要給大家介紹了關于C/C++經典實例之模擬計算器的相關資料,文中通過示...

    jia150610152021-06-07
  • C/C++C語言中炫酷的文件操作實例詳解

    C語言中炫酷的文件操作實例詳解

    內存中的數據都是暫時的,當程序結束時,它們都將丟失,為了永久性的保存大量的數據,C語言提供了對文件的操作,這篇文章主要給大家介紹了關于C語言中文件...

    針眼_6702022-01-24
  • C/C++深入理解goto語句的替代實現方式分析

    深入理解goto語句的替代實現方式分析

    本篇文章是對goto語句的替代實現方式進行了詳細的分析介紹,需要的朋友參考下...

    C語言教程網7342020-12-03
主站蜘蛛池模板: 粗了大了 整进去好爽视频 刺激一区仑乱 | 男人天堂a| 人与蛇boxxⅹ | ssni-497新任美脚女教师 | 4455四色永久免费 | 果冻传媒林予曦图片 | 欧美色成人tv在线播放 | 福利视频一区二区三区 | 色多多在线观看视频 | 日韩在线免费看 | 国产成人在线综合 | 日本三级在线观看免费 | 五月婷婷在线免费观看 | 男神插曲女生动漫完整版动漫 | 麻豆视频免费在线观看 | a在线观看欧美在线观看 | 欧美专区亚洲 | 91日本在线观看亚洲精品 | 无人区在线观看免费观看 | 青青成人在线 | 大ji巴好好爽好深网站 | 四虎影院在线免费观看视频 | 肥胖女性大bbbbbb视频女厕 | 男人晚上适合偷偷看的污污 | 亚洲精品卡一卡2卡3卡4卡 | 亚洲国产成人精品无码区99 | 国产成人精品曰本亚洲77美色 | 99精品在免费线视频 | 欧美一级高清免费a | 免费一区在线 | 99久久国语露脸精品国产 | 欧洲第一区第二区第三区 | a级特黄毛片免费观看 | 无人在线视频高清免费观看动漫 | 日本高清在线观看天码888 | 99这里只有精品在线 | 天堂中文在线观看 | 暗卫调教女主肉高h | 性鸥美| 国产a一级 | 久久黄色录像 |