QT 5 新語法之訊號過載問題

2021-08-25 17:04:45 字數 2309 閱讀 2422

在 qt

4 qt4

中,關聯訊號和槽比較常用的是(這裡訊號用 va

luec

hang

ed()

v al

uech

ange

d(

),槽用 se

tval

ue()

s et

valu

e(

)演示):

connect(sender, signal(valuechanged(int)), receiver, slot(setvalue(int)));
這裡使用的 si

gnal

s ig

na

l和 sl

ots lo

t是可以將引數轉換為字串的兩個巨集,但是這裡存在兩個問題——沒有編譯期檢查和無法使用相容型別的引數,所以在 qt

5 qt5

中提供了新的訊號槽語法(因為向下相容,所以舊的語法也是可以用的)。

前面演示的關聯用 qt

5 qt5

的新語法寫如下:

connect(sender, &sender

::valuechanged, receiver, &receiver

::setvalue);

這裡,se

nder

s en

de

r是 se

nder

s en

de

r物件的型別,re

ceiv

err ec

eive

r是 re

ceiv

err ec

eive

r物件的型別。

這樣寫不止解決了上述的問題,還允許鏈結到任意函式。不過這樣也引入了一些坑,新手(比如說我)在使用新語法的時候總會在編譯期報如下類似錯誤(支援編譯期檢查的優點這麼快就體現出來了

/(ㄒoㄒ)/~~

/(ㄒoㄒ)/~~

) 這裡提示沒有匹配到這個函式,沒有匹配到的原因是因為第二個引數沒有解釋清楚過載型別……其實這是因為訊號過載產生了歧義導致的,在舊的語法中,因為會指定引數型別,所以不會出現這個問題,但是在新的語法中並沒有指定引數型別,所以遇見過載時就栽了。

報錯中顯示我用的的 qs

pinb

oxq sp

inbo

x,而這個類中定義了兩個名字叫 va

luec

hang

edv al

uech

ange

d的訊號:

void valuechanged(int);

void valuechanged(const qstring &);

所以我們需要在使用的時候指定清楚呼叫哪個過載的訊號,這時候就輪到 st

atic

_cas

t<>()

s ta

tic_

cast

<>()

出場了!

首先我們先看一下上述錯誤**如何修改:

connect(ui->spinbox, static_cast

(&qspinbox::valuechanged), this, &timeline::sendsignalsframechanged);

其次,我們來說一下 st

atic

_cas

t<>()

s ta

tic_

cast

<>()

,這是乙個強制轉換的函式,原型是:

static_cast

(expression)

功能是將 ex

pres

sion

e xp

ress

io

n強制轉換為 ty

pe−i

d typ

e−id

型別,但是它沒有執行時型別檢查來保證轉換的安全性。st

atic

_cas

t sta

tic_

cast

》……所以在使用這個函式轉換以後,便可以明確表明 va

luec

hang

edv al

uech

ange

d訊號使用的是哪個過載,問題也隨之解決。

訊號與槽的新語法 Qt5

在 qt5 的 qtbase staging 倉庫的 qobject connect ptr 分支中已經引入了一種全新的訊號與槽的語法。參看 new signal slot syntax possibly coming in qt 5 一文。connect slider,signal valuech...

QT5 訊號與槽

前言 訊號與槽是qt的精華所在,也是他區分於其他軟體的關鍵地方,所以我們學習qt肯定無法繞過這一核心 當物件內部狀態發生改變,訊號就被反射,只有定義了這個訊號的類和他的子類才能發射這個訊號 訊號的宣告是在標頭檔案中進行的,qt的signals關鍵字指出進入了訊號宣告區,隨後即可宣告自己的訊號。訊號由...

Qt之 訊號與槽 connect新語法(自動關聯)

connect sender,signal valuechanged qstring,qstring receiver,slot updatevalue qstring qt 實際上利用signal和slot這兩個巨集,把其後的函式名轉換成乙個字串。隨後,moc 將會掃瞄全部檔案,將所有的 sign...