在 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...