在Qt里按鈕控件默認對應一個on_pushButton_clicked()成員,如果想用點擊信號,在代碼中實現on_pushButton_clicked()成員即可。
最近看了一段代碼,里面並沒有connect函數,只定義了pushbutton,也沒有看到調用on_pushButton_clicked()的語句,那么難道說只要點了button,就會自動調用on_pushButton_clicked()的內容嗎?
這種寫法是QtCreator默認的,也就是它背后幫你完成了connect。
比如對象obj有信號A,你只需要在同一個類中完成如下形式的函數即可
on_obj_a()。
編譯時QtCreator就會自動在背后處理,效果就是對象obj的信號a被連接到這個函數。
推薦還是不這樣做,這樣做影響閱讀。等多起來時自己也看不明白。也許不應該說是QtCreator的幫助,應該是moc的幫助恰當點。
Qt Meta Object Compiler會讀取*.h文件 生成 moc_*.cpp文件,你說的沒有看到調用on_pushButton_clicked()的語句,
是因為調用此語句的方法剛好就存在於上面的moc_*.cpp文件里,qmake生成的makefile里會指定源代碼:
***************************************Makefile*******************
SOURCES = *.cpp \
main.cpp moc_*.cpp
******************************************************************
moc_*cpp文件與*.cpp文件在同一目錄下。
那種格式的不需要專門去connect,
用的是另外一個函數,在ui_mainwindow.h這個文件中,
名字叫connectSlotsByName
詳細說明:
void QMetaObject::connectSlotsByName ( QObject * object ) [static]
Searches recursively for all child objects of the given object, and connects matching signals from them to slots of object that follow the following form:
void on_<object name>_<signal name>(<signal parameters>);
Let's assume our object has a child object of type QPushButton with the object name button1. The slot to catch the button's clicked() signal would be:
void on_button1_clicked();
QMetaObject::connectSlotsByName(MainWindow);
另外需要說明的是如果在此基礎上再加入手動的connect的話將會響應兩按鈕的點擊效果,或是直接不應該。
Qt的增加信號與槽之間的連接方法有:手動編寫conncet代碼和Ui連接
Qt的對像之間通信中信號和槽比較常用,其它的通信方法還有postEvent
所以用法是:
1、在UI文件里加入按鈕,objectName 設置為pushButtonA
2、在引用的頭文件(比如MainWindow.h)里加入按鈕曹的聲明:
public slots:
void on_pushButtonConnect_clicked();
3、在調用處使用,(比如MainWindow.cpp)。
void MainWindow::on_pushButtonConnect_clicked()
{
qDebug("pushButtonConnect");
}