1. 程式人生 > >QT窗體間傳值總結之Signal&Slot

QT窗體間傳值總結之Signal&Slot

          在寫程式時,難免會碰到多窗體之間進行傳值的問題。依照自己的理解,我把多窗體傳值的可以使用的方法歸納如下:

      1.使用QT中的Signal&Slot機制進行傳值;

      2.使用全域性變數;

      3.使用public形式的函式介面;

      4.使用QT中的Event機制(這種沒有把握,但是感覺應該是可以的),但是實現起來應該比前幾種複雜,這裡不做討論。

       下面分別進行討論:

1.使用QT中的Signal&Slot機制進行傳值:

      QT中的Signal&Slot機制相比於MFC中的訊息機制簡單了許多,它保證了任何物件之間均可以通過這種方式進行通訊,甚至可以得到訊息的sender。這裡就拿一個簡單的窗體間傳值作為例子。

      首先看一下主窗體MainWindow:

      在設計器中拖拽一個Label和一個TextEdit控制元件到介面上,TextEdit用於顯示傳遞過來的資料。

    建立一個右下有兩個按鍵的對話方塊,放置一個Label和一個LineEdit。

     下面就是編碼的操作了,我們需要在Dialog中宣告一個訊號,當用戶點選OK時傳遞LineEdit中的內容到mainWindow中,具體的dialog.h程式碼為:

#ifndef DIALOG_H
#define DIALOG_H

#include <QDialog>

namespace Ui {
class Dialog;
}

class Dialog : public QDialog
{
    Q_OBJECT
    
public:
    explicit Dialog(QWidget *parent = 0);
    ~Dialog();
    
private:
    Ui::Dialog *ui;
signals:
    void  sendData(QString);
private slots:
    void on_buttonBox_accepted();
};

#endif // DIALOG_H 
      其中的signals:void sendData(QString)便是我們需要的訊號函式,同時聲明瞭一個槽函式

       void on_buttonBox_accepted();用於相應確定按鈕的click事件。下面就是需要在該函式中產生一個訊號。程式碼如下:

void Dialog::on_buttonBox_accepted()
{
    emit sendData(ui->lineEdit->text());
}
      程式碼異乎尋常的簡單,只需要用emit的方式呼叫sendData函式,將需要的引數傳遞進去即可。而MainWindow中則需要宣告接收的槽函式,注意槽函式引數只能與訊號函式少或相等,而不能多於訊號函式引數個數。在MainWindow的標頭檔案中宣告槽函式:
private slots:
    void receiveData(QString data);

    為了便於測試,我只在MainWindow的建構函式中建立了一個Dialog物件,並連線了訊號和槽,具體為:
MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    //訊號槽方式下父子窗體傳值的測試
    Dialog *dlg = new Dialog;
    //關聯訊號和槽函式
    connect(dlg,SIGNAL(sendData(QString)),this,SLOT(receiveData(QString)));
   // dlg->setModal(true); 不論是模態或者非模態都可以正常傳值
    dlg->show();
}
      這裡,我沒有將父視窗的指標傳遞到Dialog中,如new Dialog(this),這種方式下,實際上可以歸結到第三類傳值方式中去。因為此時,可以使用MainWindow中的父視窗的函式進行資料的賦值和操作。

      這裡,可能還有一個問題就是,父視窗如何給子視窗傳值,一方面,仍然可以使用訊號和槽的方式進行,但是,我感覺更便利的方式倒是使用這種public介面的方式進行傳值。這種來的更直接和明顯。當然,可以看出Signal&Signal方式進行此類的處理會更有通用性。

    在receiveData(QString)的槽函式中進行接收到資料的處理,這裡僅僅進行了簡單的顯示:

void MainWindow::receiveData(QString data)
{
    ui->textEdit->setText(data);
}

    最後看下結果:

 

       最終的結果,因為訊號和槽可以是多對多的,所以,在類似多個窗體廣播資訊時,這種方式就很有用,當然也可以使用全域性變數的形式。

相關推薦

QT窗體總結Signal&Slot

          在寫程式時,難免會碰到多窗體之間進行傳值的問題。依照自己的理解,我把多窗體傳值的可以使用的方法歸納如下:       1.使用QT中的Signal&Slot機制進行傳值;       2.使用全域性變數;       3.使用public形式的函

QT窗體總結

 在寫程式時,難免會碰到多窗體之間進行傳值的問題。依照自己的理解,我把多窗體傳值的可以使用的方法歸納如下:       1.使用QT中的Signal&Slot機制進行傳值;       2.使用全域性變數;       3.使用public形式的函式介面;

C# 窗體

pen 父窗體 public end cor art sender btn gre Form1: 父窗體, Form2: 子窗體。 1.父窗體接收子窗體的返回值: public partial class Form1: Form { pri

winform 利用事件在窗體

執行結果如下: 實現部分;建立兩個form窗體,Form1,Form2;建立一個類MyEventArg.cs. MyEventArg.cs程式碼: using System; using System.Collections.Generic; using Sys

Qt 子視窗父視窗切換,視窗

 本人程式碼 程式碼下載:http://download.csdn.net/detail/u013378306/9621322 效果:實現 父視窗 開啟子視窗,關閉子視窗,子視窗向父視窗傳值 win_win.pro 檔案 #----------------------

小程式-----頁面

//登入 oLogin: function ( ) { let that = this; var pre = that.data; let avatarUrl = wx.getStorageSync('avatarUrl'); wx.request({ url: 'htt

ASP.NET5種全域性變數!頁面方法!

之一: 1. 使用QueryString變數   QueryString是一種非常簡單的傳值方式,他可以將傳送的值顯示在瀏覽器的位址列中。如果是傳遞一個或多個安全性要求不高或是結構簡單的數值時,可以使用這個方法。但是對於傳遞陣列或物件的話,就不能用這個方法了。下面是一個例子:   a.aspx的C#程式

asp.net頁cookies

下面例項: set.aspx程式碼如下: <%@ Page Language="C#" AutoEventWireup="true" CodeFile="Sample_05.aspx.cs" Inherits="Sample_05" %> <!

窗口的幾種方法

sdn 架構設計 基本 popu 問題 剛才 text src 界面 剛開始學Winform的同學基本上都會遇到窗口傳值的問題,怎樣解決問題,事實上就是須要解決你對窗口的一個理解。 一定要記住,窗口(Form),它是一個類(Class)。!

Activity的方式

官方 serializa 例如 代碼 nds creat ont fin idg 原文地址:https://blog.csdn.net/qq_33748378/article/details/53023036 Activity間的跳轉: 要了解Activity間的傳值,

vue入門及組件代碼

class lang 介紹 代碼量 func cdn title 通訊 關於 vue是一種mvvm的方式,比起jquery的mvp的方式,可以較少操作dom,代碼量也少很多。 vue有兩種方式,一種是工程化的方式,一種是像jquery那樣使用 <script src=

C#窗體向另一個窗體實時

font mage col pan tro art 圖片 spa src C#窗體向另一個窗體實時傳值 另外的傳值方法: C#窗體向另一個窗體實時傳值

C# 委托 父窗口與子窗口

message orm await for 解釋 ech har component str 1)目標 父窗口與子窗口都有1個Button和1個Label。 目標1:單擊父窗口的Button,子窗口的Label將顯示父窗口傳來的值。 目標2:單擊子窗口的Button,父窗口

MUI框架-02-註意事項-適用場景-實現頁面

存在 net custom fine 影響 chrom 無效 dev 選項卡 MUI框架-02-註意事項-適用場景-實現頁面間傳值 關於開發,我拷貝太多也沒什麽意義,就請查閱:官方文檔:http://dev.dcloud.net.cn/mui/ui/ 快速入門 - 註意

MUI頁面問題

在使用MUI做APP的時候,很多情況下都需要頁面間通訊傳值,mui提供了一個機制來解決這個問題:自定義事件; 比如在A頁面,需要傳參到B頁面,那麼此時B頁面就是目標介面; 在A頁面: mui.fire(target,event,data) 在這裡target是需傳值的目標webv

使用localStorage進行頁面

1.html if(window.localStorage){ var storage = window.localStorage; var userdata={ name:hui('#name').val(), phone:hui('#input_pho

Vue 非父子元件

非父子元件(隔多代、兄弟等)之間傳值,主要有兩種方式:   - vuex   - 釋出訂閱模式(在 vue 中稱為匯流排機制) 下文將介紹通過匯流排機制(Bus/匯流排/釋出訂閱模式/觀察者模式),解決非父子元件之間的傳值。 <div id="root"&

靜態頁面

方法一: 定義一個點選事件方法,獲取input輸入的值,傳值開啟到新的頁面 <script language="JavaScript"> function loginChang(){ var name =document.getElementById("n

Winform窗體之間

1.採用static變數 from1: public partial class frmMain : Form {   public static string name= ""; } from2: MessageBox.Show(Form1.name.Trim());

純前端,html頁面方式:

純前端,html頁面間傳值方式: 1、使用window.location的href屬性,等於重新重新整理頁面,必須是get請求,post請求需要服務端解析,post是用來客戶端服務端傳遞資料 window.location.href=”b.html?valus=parm”; 傳值端 window.loca