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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Qt修炼手册4_信号与槽

發布時間:2025/3/15 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Qt修炼手册4_信号与槽 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1.前言

為了處理個體間的通信事件,Qt提供了信號與槽。信號與槽不僅可以處理GUI上發生的事件,也可以實現個體間的數據通信。值得深入把握。

2.信號與槽

信號與槽是一種用于對象間通信的機制。為了用戶在GUI程序點擊按鈕控件時可運行指定函數,信號與槽提供可運行指定函數的框架。處理多種用戶事件前,信號和槽提供多種回調(Callback)函數

Qt提供的所有控件擁有多種預設信號。例如,QPushButton控件的單擊(click)雙擊(double click)、鼠標經過(mouse over)等多重信號。同時,槽也提供了多種虛函數(virtual function)

信號用于處理發生的事件,而槽則是指定從信號接受事件的處理函數。因此,可以將信號和槽視為一個管道(pipeline).

根據上面的描述,我們也能注意到一個很重要的一點:信號與槽通常不是1:1匹配的。一個信號可以關聯多個槽,一個槽也可以關聯多個信號。示意圖如下:


信號與槽之間的關聯函數是connect函數。

3.典型實例

主文件 main.cpp:

#include "mysigslot.h" #include <QtWidgets/QApplication>int main(int argc, char *argv[]) {QApplication a(argc, argv);mySigSlot w;w.resize(400, 300);w.setWindowTitle("Example for Signal-Slot");w.show();return a.exec(); }頭文件 mySigSlot.h:

#ifndef MYSIGSLOT_H #define MYSIGSLOT_H#include <QtWidgets/QWidget> #include "ui_mysigslot.h" #include <qlabel.h> /*********************************************************/ class mySigSlot : public QWidget {Q_OBJECTpublic:mySigSlot(QWidget *parent = 0);~mySigSlot();private:Ui::mySigSlotClass ui; private:QLabel* lbl; }; /*********************************************************/ class SignalSlot : public QObject {Q_OBJECT public:SignalSlot() { m_value = 0; }int value() const { return m_value; }public slots :void setvalue(int value);signals:void valueChanged(int newvalue);private:int m_value; }; /*********************************************************/ #endif // MYSIGSLOT_H源文件 mySigSlot:#include "mysigslot.h"mySigSlot::mySigSlot(QWidget *parent): QWidget(parent) {ui.setupUi(this);lbl = new QLabel("",this);lbl->setGeometry(10, 10, 100, 40);SignalSlot s1, s2;QObject::connect(&s1, SIGNAL(valueChanged(int)),&s2, SLOT(setvalue(int)));s1.setvalue(100);lbl->setText(QString("%1").arg(s2.value())); } mySigSlot::~mySigSlot() { }void SignalSlot::setvalue(int value) {m_value = value; //assignment//為了發送信號 使用關鍵字emitemit valueChanged(m_value); //emit signal }實現結果:

信號與槽的流通過程:

首先定義原則“s1 的 valueChanged()函數被觸發,那么s2將被賦予與s1相同的值”。先對s1賦值,該過程激發了信號函數s1.valueChanged(),從而相應“信號-槽”管道,s2.value()獲得新值。最后顯示在QLabel控件上。

4.參考資料

[1]. 金大 [zhen. Qt 5開發實戰[M]. 人民郵電出版社, 2015.

總結

以上是生活随笔為你收集整理的Qt修炼手册4_信号与槽的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。