Qt on_pushButton_clicked()的用法【worldsing筆記】


在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");
}
 
        

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM