深入訊號與插槽

2021-05-22 10:35:02 字數 2506 閱讀 1232

深入訊號與插槽

signals and slots in depth

—《prentice hall ptr. c

++gui programming with qt 4.jun.2006

》選自chapter 2

訊號與插槽是

qt程式設計的基礎。它使得程式編寫者不需要了解物件之間的任何關係來幫定物件。我們已經把一些訊號和插槽連線在一起了,並宣告了我們自己的訊號與插槽,實現了我們自己的插槽,發**我們自己的訊號。讓我們花點時間更進一步地了解這種機制。

插槽幾乎和普通

c++成員函式一樣。可以是虛函式;可以被過載;可以是公共的、保護或者是私有的,可以像

c++成員函式一樣直接訪問;並且引數可以是任何型別。不同的是插槽可以和乙個訊號連線,在這種情況下每次當訊號傳送時它就被自動地呼叫。

connect()

語句的宣告像下面:

connect(sender, signal(signal), receiver, slot(slot));

上面的sender

和receiver

是指向qobjects

型別的指標,

signal

和slot

是不帶引數名的函式名。

signal()

和slot()

巨集本質上就是把它們的引數轉換成乙個字串。

在下面的例子中我們要扯得遠一點,我們總習慣於把不同的訊號連線到不同的插槽,下面是需要考慮的其他一些情況。

1. 乙個訊號可以連線到多個插槽:

connect(slider, signal(valuechanged(int)), spinbox, slot(setvalue(int)));

connect(slider, signal(valuechanged(int)), this, slot(updatestatusbarindicator(int)));

當訊號發射時,插槽乙個接乙個地被呼叫,呼叫次序不確定。

2. 多個訊號連線到同乙個插槽:

connect(lcd, signal(overflow()), this, slot(handlematherror()));

connect(calculator, signal(divisionbyzero()), this, slot(handlematherror()));

無論哪個訊號發射,插槽都被呼叫。

3. 乙個訊號可以連線到另乙個訊號:

connect(lineedit, signal(textchanged(const qstring &)), this, signal(updaterecord(const qstring &)));

當前面乙個訊號發射時,後面這個訊號也發射。除了這點之外,訊號訊號的連線和訊號插槽的連線不能分別。

4. 連線可以被解除:

disconnect(lcd, signal(overflow()), this, slot(handlematherror()));

這較少用到,因為當乙個物件被刪除時,

qt會自動移除這個物件所有關聯的連線。

為了成功地連線乙個訊號到插槽(或另乙個訊號),必須有相同的引數型別,正確的引數順序:

connect(ftp, signal(rawcommandreply(int, const qstring &)), this, slot(processreply(int, const qstring &)));

特別地,如果乙個訊號的引數多於所連線插槽的引數個數,多餘的引數將被直接忽略:

connect(ftp, signal(rawcommandreply(int, const qstring &)), this, slot(checkerrorcode(int)));

如果引數型別不相容,訊號或者插槽不存在,如果程式在

debug

模式下,

qt會在執行時發出乙個警告。類似地,如果引數名包含在訊號或插槽簽名中,

qt也會給出乙個警告。

到目前為止,我們僅在

widgets

中用了訊號和插槽。但這種機制本身在

qobject

中實現,並不侷限於

gui程式設計。這種機制可以被使用在任何

qobject

的子類當中:

class employee : public qobject

int salary() const

public slots:

void setsalary(int newsalary);

signals:

void salarychanged(int newsalary);

private:

int mysalary; };

void employee::setsalary(int newsalary) }

注意setsalary()

插槽是如何被實現的。如果

newsalary != mysalary

,我們僅僅發射

salarychanged()

訊號,這保證了迴圈連線不會進入無限迴圈。

PyQT事件處理(訊號和插槽)

以下 可以載入剛才設計的ui from pyside2.qtuitools import quiloader class calc def init self 載入剛才設計的.ui檔案 self.ui quiloader load d vs2019 wf calc calc calc.ui 給ui中...

PyQT事件處理(訊號和插槽)

以下 可以載入剛才設計的ui from pyside2.qtwidgets import from pyside2.qtuitools import quiloader class calc def init self 載入剛才設計的.ui檔案 self.ui quiloader load d vs...

Vue深入 10 表單元件 插槽

引入時用雙標籤 就會把插槽值賦值進去 第二種寫法 2.6版本 header 第三種 寫法 header 預設1預設2 預設3 子元件這裡面就會顯示預設123 下面這個不行,插槽中只能訪問當前作用域,不能訪問傳遞過去的作用域中的內容 message 這樣可以 message 子元件舊的slot sco...