Qt on_pushButton_clicked()的用法

来源:互联网 发布:jsp与php的区别 编辑:程序博客网 时间:2024/04/30 16:01

转载于:http://www.ithao123.cn/content-5217169.html

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