昨天在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重新编辑 ]