国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

【Qt】信號槽的三種連接語法

這篇具有很好參考價值的文章主要介紹了【Qt】信號槽的三種連接語法。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

【Qt】信號槽的三種連接語法

實現(xiàn)觀察者模式,可以使用函數(shù)回調(diào),但注冊回調(diào)函數(shù)有一定局限,安全性也沒有保證。所以一定程度上可以說 Qt 信號槽是對回調(diào)機(jī)制進(jìn)行了封裝。

Qt 的信號槽能夠連接(connect) 和編譯通過,需要滿足兩個條件

  1. 信號的參數(shù)個數(shù)大于等于槽函數(shù)
  2. 信號槽的參數(shù)個數(shù)相同的部分,參數(shù)類型必須一一對應(yīng)

創(chuàng)建信號槽連接,有以下三種方式

1. 使用 ui 界面控件

第一種,使用 ui 界面上的控件,通過右鍵 -> 轉(zhuǎn)到槽,則會在對應(yīng)界面的 cpp 生成類似以下函數(shù)名稱的代碼

void MainWindow::on_pushButton_clicked()
{
  
}

on_WidgetName_SignalName

on + 控件名稱 + 信號名稱

此種方式生成槽函數(shù),編譯時不進(jìn)行檢查,在運(yùn)行時連接,通過 Qt 自身 moc (meta object compiler) 系統(tǒng)的反射機(jī)制來連接兩個函數(shù)。

所以在控件名稱修改時,在運(yùn)行時會提示連接失敗。

另一個缺陷是這種連接方式也不方便維護(hù),連接(connect)和解除連接(disconnect)都不在可控范圍內(nèi)。

2. Qt4 的連接語法

第二種方式,使用 Qt4 語法的連接,也就是使用宏擴(kuò)展, 本質(zhì)上還是利用字符串的反射機(jī)制,示例:

connect(sender, SIGNAL(sigfunc()), receiver, SLOT((slotfunc()));

connect 的四個參數(shù)為:發(fā)送者對象指針,SIGNAL(發(fā)送者信號函數(shù)),接收者對象指針,SLOT(接收者槽函數(shù))

如果查看 SIGNAL, SLOT 這兩個宏的實現(xiàn),就可以注意到這兩個宏是將函數(shù)名稱轉(zhuǎn)換為字符串

#ifndef QT_NO_META_MACROS
#ifndef QT_NO_DEBUG
#define QLOCATION "\0" __FILE__ ":" QT_STRINGIFY(__LINE__)
#ifndef QT_NO_KEYWORDS
#	define METHOD(0)  qFlagLocation("0"#a QLOCATION)
#endif
# define SLOT(a) qFlagLocation("1"#a QLOCATION)
# define SIGNAL(a) qFlagLocation("2"#a QLOCATION)
#else 
# ifndef QT_NO_KEYWORDS
#  define METHOD(a)  "0"#a
# endif
# define SLOT(a) "1"#a
# define SIGNAL(a) "2"#a
#endif

# 號用于將其后面的宏參數(shù)進(jìn)行字符串化, 也就是說對它之后的變量通過替換后再其左右各加上一個雙引用。

slot 槽函數(shù)以 “1” 打頭,signal 信號函數(shù)以 “2” 打頭。QT_STRINGIFY 宏的定義也是單井號的使用

#define QT_STRINGIFY2(x) #x
#define QT_STRINGIFY(x) QT_STRINGIFY2(x)

但相較第一種方式,此種方式編譯階段做了字符串形式的參數(shù)一致性檢查。

缺點是無法確認(rèn)類中是否包含此函數(shù),可以在兩個宏中放入兩個參數(shù)匹配但根本不存在的函數(shù),一樣能在編譯期間順利通過編譯檢查,卻在運(yùn)行時提示連接失敗。

3. Qt5 的連接語法

第三種,Qt5 中提供了函數(shù)指針形式的 connect 語法,示例:

connect(sender, &Sender::signal, receiver, &Receiver::slot);

類名加函數(shù)取地址,確保了編譯器檢查信號與槽函數(shù)是否匹配,可以減少運(yùn)行時出現(xiàn)連接失敗的情況。

還有一種 lambda 表達(dá)式的變體,也是使用函數(shù)指針的方式來連接

connect(sender, &Sender::signal, [](){
  //... implement of slot
});

但 Qt5 語法中如果出現(xiàn)信號或槽函數(shù)重載,或兩者都有重載的情況下,connect 不會智能匹配,重載情況下直接使用,編譯會報錯,錯誤信息如下:

no matching member function for call to 'connect'

調(diào)用 connect 沒有匹配的成員函數(shù)

可以使用 Qt 的 QOverload 來處理,假如有以下信號和槽函數(shù)

signals:
  void sigfunc(int);
  void sigfunc(QString);
//...
public slots:
  void slotfunc(int);
  void slotfunc(QString);

連接時可以使用QOverload<T>::of ,示例:

connect(sender, QOverload<int>::of(&Sender::sigfunc), 
	receiver, QOverload<int>::of(&Receiver::slotfunc));

connect(sender, QOverload<QString>::of(&Sender::sigfunc), 
	receiver, QOverload<QString>::of(&Receiver::slotfunc));

來分別連接信號和槽函數(shù)的重載 (int, QString)文章來源地址http://www.zghlxwxcb.cn/news/detail-642985.html

到了這里,關(guān)于【Qt】信號槽的三種連接語法的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進(jìn)行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • Qt中信號槽的介紹及使用方法

    Qt中信號槽的介紹及使用方法

    目錄 三、信號槽 1. 信號槽的概念 2. 函數(shù)原型 2.1 自帶信號 → 自帶槽 2.2 自帶信號 → 自定義槽 2.3 自定義信號 3. 參數(shù)傳遞 3.1 全局參數(shù) 3.2 信號槽傳參 4. 對應(yīng)關(guān)系 4.1 一對多 4.2 多對一 在之前的學(xué)習(xí)中,可以實現(xiàn)簡單的UI效果,但是按鈕不能點擊。如果讓按鈕能在用戶點擊后

    2024年02月09日
    瀏覽(21)
  • QT的信號槽的四種寫法和五種鏈接方式

    QT的信號槽的四種寫法和五種鏈接方式

    目錄 四種信號槽寫法: 五種連接方式: 實例: 常見錯誤及改正: 錯誤1: 未連接信號與槽 錯誤2: 信號和槽參數(shù)不匹配 錯誤3: 未使用Q_OBJECT宏 錯誤4: 跨線程連接未處理 ? 在Qt中,信號(Signal)和槽(Slot)是一種用于對象之間通信的機(jī)制,用于實現(xiàn)一種松耦合的方式。信號被

    2024年02月13日
    瀏覽(23)
  • 關(guān)于一個QT程序的簡單破解思路(不需要分析信號和槽的方法,通用所有程序的破解思路)

    關(guān)于一個QT程序的簡單破解思路(不需要分析信號和槽的方法,通用所有程序的破解思路)

    幾年前,公司買了臺國產(chǎn)貼片機(jī),里面的主程序是QT編寫,運(yùn)行在WINDOW XP系統(tǒng)上。主程序打開的界面,如圖: 我來簡單介紹下程序界面,各位讀者不需要搞明白功能,只要知道大體的流程即可。 一、左邊的列表: 貼片生產(chǎn)文件,里面包括了貼片時元器件的坐標(biāo)、飛達(dá)安裝的元器件類型、

    2024年01月24日
    瀏覽(28)
  • Qt中使用OpenGL的三種方式

    Qt中使用OpenGL的三種方式

    1.繼承QOpenGLWidget并重寫基類如下函數(shù)? 通過使用QOpenGLContext來操作OPENGL函數(shù)? ?2.?繼承QOpenGLFunctions類可直接使用OPENGL函數(shù)? ?直接使用OPENGL函數(shù)? 3. 繼承QOpenGLWidget 與QOpenGLExtraFunctions ?在OPENGL中使用Shader 最終效果?

    2024年02月14日
    瀏覽(25)
  • Qt comboBox控件的三種基本用法

    1、用法一: 一般用到控件comboBox的基本用法是獲取當(dāng)前的值: 1.currentIndex(); 獲取當(dāng)前comBox的索引,是int類型的值。 2.currentText(); 獲取當(dāng)前comBox的文本,是QString類型。 2、用法二: 可以通過以下兩種方式來通過切換comobox的值來執(zhí)行一些指令: 1、通過首先在界面上拖入控件

    2024年02月12日
    瀏覽(16)
  • QT中使用QtXlsx庫的三種方法 QT基礎(chǔ)入門【Excel的操作】

    對于Linux用戶,如果Qt是通過“ apt-get”之類的軟件包管理器工具安裝的,請確保已安裝Qt5開發(fā)軟件包qtbase5-private-dev QtXlsx是一個可以讀寫Excel文件的庫。它不需要Microsoft Excel,可以在Qt5支持的任何平臺上使用。該庫可用于從頭開始生成新的.xlsx文件從現(xiàn)有.xlsx文件中提取數(shù)據(jù)編

    2024年02月12日
    瀏覽(29)
  • Qt系列——點擊按鈕關(guān)閉窗口的三種實現(xiàn)方式,附源碼

    Qt系列——點擊按鈕關(guān)閉窗口的三種實現(xiàn)方式,附源碼

    主要實現(xiàn)了點擊QPushButton按鈕,關(guān)閉窗口的功能。 簡單設(shè)計界面如下,按鈕名稱如圖中右側(cè)紅框中內(nèi)容 源程序連接

    2024年02月11日
    瀏覽(55)
  • QT信號槽連接方式

    1.QT信號槽主要分兩個連接方式,手動和自動: 1.1 使用 connect() 函數(shù)手動連接信號和槽: QObject::connect(sender, SIGNAL(signal()), receiver, SLOT(slot())); 自動: 1.2 使用 lambda 表達(dá)式連接信號和槽: connect(sender, Sender::signal, ={ receiver-slot(); }); 1.3 通過使用 QMetaObject::connectSlotsByName() 函數(shù)自動

    2024年02月12日
    瀏覽(22)
  • Python Qt GUI設(shè)計:將UI文件轉(zhuǎn)換為Python文件的三種妙招(基礎(chǔ)篇—2)

    Python Qt GUI設(shè)計:將UI文件轉(zhuǎn)換為Python文件的三種妙招(基礎(chǔ)篇—2)

    目錄 1、創(chuàng)建項目 2、將.ui文件生成.py文件 2.1、Eric 6編譯 ?2.2、Python命令行編譯 ?2.3、腳本編譯 3、界面、邏輯分離思想 在開始本文之前提醒各位朋友,Python記得安裝PyQt5庫文件,Python語言功能很強(qiáng),但是Python自帶的GUI開發(fā)庫Tkinter功能很弱,難以開發(fā)出專業(yè)的GUI。好在Pytho

    2024年02月03日
    瀏覽(21)
  • qt信號和槽避免多次連接

    qt同一個信號和槽多次連接,則槽函數(shù) 會觸發(fā)多次 (默認(rèn)),可能不是我們想要的結(jié)果。 有3種方法可以解決這個問題: 因為初始化函數(shù)在在整個程序中只運(yùn)行一次,所以這里面連接信號和槽,就能避免重復(fù)連接問題了。 Qt::UniqueConnection 的作用是:如果該信號以前沒連接過

    2024年02月10日
    瀏覽(47)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包