昨天在QtForum上看到有人说在Qt 4.0 Commercial for VS.net 里能够直接双击控件然后产生双击事件slot函数,就能直接在这个函数里写代码了。以前一直没注意这个问题,就试验了一下,果然能够。不过在.ui里并没有生成相关的conect,那么到底是怎样进行signal与slot的连接的?
我在.ui生成的ui_xx.h里,看到有这样一句话,
QMetaObject::connectSlotsByName(ex46Class);
我想就应该是它了,但我却在qt reference里指找不到它的文档,那么它的规则到底是怎样的?我自己写程序模仿它却又不行。 下面是代码,请注意红色的部分。于是,我自己就又自己在代码里加上了另一个按钮的事件处理(绿色的),模仿前面的那两个红色的,竟然也能和前面的同样使用。
这是头文件:
#ifndef EX46_H
#define EX46_H
#include <QtGui/QWidget>
#include "ui_ex46.h"
class ex46 : public QWidget
{
Q_OBJECT
public:
ex46(QWidget *parent = 0);
~ex46();
private:
Ui::ex46Class ui;
private slots:
void on_pushButton_clicked();
void on_pushButton_4_clicked();
void on_pushButton_3_clicked();
};
#endif // EX46_H
这是.cpp文件:
#include <QMessageBox>
#include "ex46.h"
ex46::ex46(QWidget *parent)
: QWidget(parent)
{
ui.setupUi(this);
}
ex46::~ex46()
{
}
void ex46::on_pushButton_4_clicked()
{
close();
}
void ex46::on_pushButton_clicked()
{
QMessageBox::about(this, QString::fromLocal8Bit("你好哇中国"), QString::fromLocal8Bit("这是信息内容"));
}
void ex46::on_pushButton_3_clicked()
{
QMessageBox::aboutQt(this, "this is a test");
}
还有.ui生成的头文件:
#ifndef UI_EX46_H
#define UI_EX46_H
#include <QtCore/QVariant>
#include <QtGui/QAction>
#include <QtGui/QApplication>
#include <QtGui/QButtonGroup>
#include <QtGui/QGridLayout>
#include <QtGui/QLineEdit>
#include <QtGui/QPushButton>
#include <QtGui/QSpacerItem>
#include <QtGui/QTextBrowser>
#include <QtGui/QWidget>
class Ui_ex46Class
{
public:
QGridLayout *gridLayout;
QSpacerItem *spacerItem;
QPushButton *pushButton_4;
QPushButton *pushButton_3;
QPushButton *pushButton_2;
QPushButton *pushButton;
QTextBrowser *textBrowser;
QLineEdit *lineEdit;
void setupUi(QWidget *ex46Class)
{
ex46Class->setObjectName(QString::fromUtf8("ex46Class"));
ex46Class->resize(QSize(447, 358).expandedTo(ex46Class->minimumSizeHint()));
gridLayout = new QGridLayout(ex46Class);
gridLayout->setSpacing(6);
gridLayout->setMargin(8);
gridLayout->setObjectName(QString::fromUtf8("gridLayout"));
spacerItem = new QSpacerItem(81, 20, QSizePolicy::Expanding, QSizePolicy::Minimum);
gridLayout->addItem(spacerItem, 2, 3, 1, 1);
pushButton_4 = new QPushButton(ex46Class);
pushButton_4->setObjectName(QString::fromUtf8("pushButton_4"));
gridLayout->addWidget(pushButton_4, 2, 4, 1, 1);
pushButton_3 = new QPushButton(ex46Class);
pushButton_3->setObjectName(QString::fromUtf8("pushButton_3"));
gridLayout->addWidget(pushButton_3, 2, 2, 1, 1);
pushButton_2 = new QPushButton(ex46Class);
pushButton_2->setObjectName(QString::fromUtf8("pushButton_2"));
gridLayout->addWidget(pushButton_2, 2, 1, 1, 1);
pushButton = new QPushButton(ex46Class);
pushButton->setObjectName(QString::fromUtf8("pushButton"));
gridLayout->addWidget(pushButton, 2, 0, 1, 1);
textBrowser = new QTextBrowser(ex46Class);
textBrowser->setObjectName(QString::fromUtf8("textBrowser"));
gridLayout->addWidget(textBrowser, 0, 0, 1, 5);
lineEdit = new QLineEdit(ex46Class);
lineEdit->setObjectName(QString::fromUtf8("lineEdit"));
gridLayout->addWidget(lineEdit, 1, 0, 1, 5);
retranslateUi(ex46Class);
QMetaObject::connectSlotsByName(ex46Class);
} // setupUi
void retranslateUi(QWidget *ex46Class)
{
ex46Class->setWindowTitle(QApplication::translate("ex46Class", "ex46"));
pushButton_4->setText(QApplication::translate("ex46Class", "PushButton"));
pushButton_3->setText(QApplication::translate("ex46Class", "PushButton"));
pushButton_2->setText(QApplication::translate("ex46Class", "PushButton"));
pushButton->setText(QApplication::translate("ex46Class", "PushButton"));
Q_UNUSED(ex46Class);
} // retranslateUi
};
namespace Ui {
class ex46Class: public Ui_ex46Class {};
} // namespace Ui
#endif // UI_EX46_H
我是怀疑QMetaObject::connectSlotsByName(ex46Class);这条语句实现了某种slot与signal的自动链接,但我不知道它的规则是什么?文档里也没有这个函数的信息。
[ 此贴被XChinux在2005-09-05 11:14重新编辑 ]