• 11695阅读
  • 6回复

【提问】关于Designer里双击自动产生的slot函数是在哪里链接的? [复制链接]

上一主题 下一主题
离线XChinux
 

只看楼主 倒序阅读 楼主  发表于: 2005-09-05
— 本帖被 XChinux 从 Qt for Linux/X11 移动到本区(2010-02-08) —
  昨天在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重新编辑 ]
二笔 openSUSE Vim N9 BB10 XChinux@163.com 网易博客 腾讯微博
承接C++/Qt、Qt UI界面、PHP及预算报销系统开发业务
离线giscn
只看该作者 1楼 发表于: 2005-09-05
文档里关于signal和slot里有讲,楼主没有仔细看

规则:
void on_widget名_signal名(signal的参数)
{}

当有Q_OBJECT存在的时候,moc编译后,会自动根据名字 connect到对应的signal上
[ 此贴被giscn在2005-09-05 11:19重新编辑 ]
http://nzt.spaces.live.com
离线XChinux

只看该作者 2楼 发表于: 2005-09-05
哦,我在索引里面没有找到,在QMetaObject的成员里也没有找到,原来它藏在那里

哈哈,独立写也搞定了。我在MinGW里也试验成功了。
[ 此贴被XChinux在2005-09-05 11:32重新编辑 ]
二笔 openSUSE Vim N9 BB10 XChinux@163.com 网易博客 腾讯微博
承接C++/Qt、Qt UI界面、PHP及预算报销系统开发业务
离线hitaeolus

只看该作者 3楼 发表于: 2005-09-13
各位老大,我用的是redhat ES 3的QT3.1.2

关于signal和slot里的
void on_widget名_signal名(signal的参数)
在哪里有讲呀????
离线XChinux

只看该作者 4楼 发表于: 2005-09-13
在Qt Assistang里的Using a Component in Your Application节里最下边有这样的一段:

A Dialog With Auto-Connect
Although it is easy to implement a custom slot in the dialog and connect it in the constructor, we could instead use uic's auto-connection facilities to connect the OK button's clicked() signal to a slot in our subclass. To do this, we only need to declare and implement a slot with a name that follows a standard convention:
  void on_<widget name>_<signal name>(<signal parameters>);
Using this convention, we can define and implement a slot that responds to mouse clicks on the OK button:
  class ImageDialog : public QDialog, private Ui::ImageDialog
  {
    Q_OBJECT

  public:
    ImageDialog(QWidget *parent = 0);

  private slots:
    void on_okButton_clicked();
  };
Automatic connection of signals and slots provides both a standard naming convention and an explicit interface for widget designers to work to. By providing source code that implements a given interface, user interface designers can check that their designs actually work without having to write code themselves.
二笔 openSUSE Vim N9 BB10 XChinux@163.com 网易博客 腾讯微博
承接C++/Qt、Qt UI界面、PHP及预算报销系统开发业务
离线hitaeolus

只看该作者 5楼 发表于: 2005-09-13
多谢搂主!!!!

在Qt 4.0的文档里找到了
这种功能在QT3里也能用,为什么QT3.0的文档里没介绍呢??
离线XChinux

只看该作者 6楼 发表于: 2005-09-13
我也是giscn说了有我才知道的
二笔 openSUSE Vim N9 BB10 XChinux@163.com 网易博客 腾讯微博
承接C++/Qt、Qt UI界面、PHP及预算报销系统开发业务
快速回复
限100 字节
 
上一个 下一个