深入訊號與插槽
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...