自己编写qt程序的时候,想使用qt on_objectName_signalName()命名规则自动关联信号和槽,老是发现失效。多方求解,答案事实上很简单就是没有理解objectName的含义。
on_objectName_signalName(signalParameters);仔细看好是objectName而不是变量名,一个控件的变量名和objectName是不同的。需要这样改:
pushButton = new QPushButton(tr("ok"));
pushButton->setObjectName("pushButtonObject");//在创建完控件后为其设定ObjectName(随便起名),在用这个name定义槽函数
//*****
//槽函数
on_pushButtonObject_clicked()
在qt uic自动生成的文件中setupUi()函数里有QMetaObject::connectSlotsByName(Xxx *xxx);有了就可以使用on_<objectname>_<signal name>(<signal parameters>)这种方式定义槽函数了,如果是使用.ui文件生成布局的话,uic会默认在setupUi里加上的。但是注意
a) 在自己写的程序中需要显式地调用QMetaObject::connectSlotsByName(Xxx *xxx),而且要卸载控件创建之后。
b) on_objectName_signalName(signalParameters);仔细看好是objectName而不是变量名,一个控件的变量名和objectName是不同的。所以应该在创建空间后紧跟着调用控件的setObjectName(QString)方法设置称要用的objectName。
c) 尽量使用connect()函数确定信号和槽关系。原因有二,由原码可知,connectSlotsByName函数最终也是调用了connect函数,在者请看下面这条。
d) 尽量不要把几个控件的objectName设置成一样的。这样的话connectSlotsByName函数只能为其中一个添加关联。
不懂可看下例:
//test.h
#ifndef TEST_H
#define TEST_H
#include <QtGui>
#include <QDialog>
//#include "ui_test.h"
class QPushButton;
class QLineEdit;
class Test : public QDialog
{
Q_OBJECT
public:
Test(QWidget *parent = 0);
~Test();
signals:
void Pushed();
public slots:
void on_pushButton_clicked();
void on_exitButton_clicked();
private:
QPushButton *pushButton;
QPushButton *exitButton;
QLineEdit *lineEdit;
};
#endif // TEST_H
//------------------------------------
//test.cpp
#include <QPushButton>
#include <QBoxLayout>
#include <QLineEdit>
#include <QWidget>
#include <qmessagebox.h>
#include "test.h"
Test::Test(QWidget *parent)
: QDialog(parent)
{
pushButton = new QPushButton(tr("ok"));
pushButton->setObjectName("pushButton");
exitButton = new QPushButton(tr("Cancel"));
exitButton->setObjectName("exitButton");
QVBoxLayout *layout= new QVBoxLayout;
layout->addWidget(pushButton);
layout->addWidget(exitButton);
this->setLayout(layout);
QMetaObject::connectSlotsByName(this);
}
Test::~Test()
{
delete pushButton;
delete exitButton;
}
void Test::on_pushButton_clicked(){
QMessageBox::information(this, "remind", "callback successful");
}
void Test::on_exitButton_clicked(){
QMessageBox::information(this, "mind", "exit successful");
}
//----------------------------------
//main.cpp
#include "test.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
Test w;
w.show();
return a.exec();
}
本文参考http://www.cnblogs.com/ttylikl/archive/2009/07/13/1522770.html