• 5185阅读
  • 4回复

关于Qt Creator自动产生的代码的疑问 [复制链接]

上一主题 下一主题
离线ssww
 
只看楼主 倒序阅读 楼主  发表于: 2009-05-31
用Qt Creator创建一个简单的名为Test的Dialog GUI Application,最后一步产生的几个文件是:main.cpp,dialog.cpp,dialog.h,dialog.ui,Test.pro。然后打开对话框的ui文件,将对话框的objectName改为"DialogClass",再添加一个按钮testButton,然后在Change signal/slots的时候,给DialogClass添加一个slots,名为slotTest()。接着将testButton的clicked()信号连接到这个槽函数上。然后实现这个槽函数。几个文件的主要内容如下:
1.ui_dialog.h文件

QT_BEGIN_NAMESPACE

class Ui_DialogClass
{
public:
    QPushButton *testButton;

    void setupUi(QDialog *DialogClass)
    {
    ...
        QObject::connect(testButton, SIGNAL(clicked()), DialogClass, SLOT(slotTest()));
    ...
    }

    void retranslateUi(QDialog *DialogClass)
    {
    ...
    }
};

namespace Ui {
    class DialogClass: public Ui_DialogClass {};
} // namespace Ui

QT_END_NAMESPACE

2.dialog.h文件

namespace Ui
{
    class DialogClass;
}

class Dialog : public QDialog
{
    Q_OBJECT

public:
    Dialog(QWidget *parent = 0);
    ~Dialog();

private:
    Ui::DialogClass *ui;
private slots:
    void slotTest();
};

3.dialog.cpp文件

Dialog::Dialog(QWidget *parent)
    : QDialog(parent), ui(new Ui::DialogClass)
{
    ui->setupUi(this);
}

Dialog::~Dialog()
{
    delete ui;
}
void Dialog::slotTest()
{
    QMessageBox::information(this,"warning!","OK! Test!");
}

让我感到疑问的几个问题是:
1.在ui_dialog.h中的这两句代码:
namespace Ui {
    class DialogClass: public Ui_DialogClass {};
}
有什么作用?这两句是自动产生的,删除后,只要重新编译,这两句代码又自动产生了。除非我手工创建对话框的代码而不是通过修改ui文件来产生。
2.DialogClass这个类跟dialog.h文件中定义的类Dialog有什么关系没有?
3.从ui_dialog.h文件中的这句代码:
QObject::connect(testButton, SIGNAL(clicked()), DialogClass, SLOT(slotTest()));
来看,槽函数slotTest()好像本应是定义在DialogClass类里的,但在实际的代码中,这个函数的定义是属于Dialog类的一个成员函数,如dialog.h文件内容所示,而且,这个函数是正确调用了的,我不知道是因为误打误撞写对了还是应该如此?Dialog是如何接收到本应属于DialogClass的信号clicked()?

谢谢回答!另外,我用的版本是Qt SDK 2009.01
离线fcymk2

只看该作者 1楼 发表于: 2009-06-01
1 2> 根据使用UI文件的方式而定 自动生成的代码是让你使用 多重继承的方式用 UI文件 ,

3>QObject::connect(testButton, SIGNAL(clicked()), DialogClass, SLOT(slotTest()));   定义在函数setupUi里面,在dialog.cpp里面调用了这个
离线yang_huafeng

只看该作者 2楼 发表于: 2009-06-01
我没用使用过UI设计过界面都是自己写的,不过通过代码可以看出来几点:
1.dialog和DialogClass没有什么太密切的关系,只是再dialog中定义并调用了DialogClass而已,你用自己定义的QDialog类也可以调用DialogClass而实现相同的功能
2.之所以信号和槽可以关联是因为ui->setupUi(this);中的this就是
QObject::connect(testButton, SIGNAL(clicked()), DialogClass, SLOT(slotTest()));   中的DialogClass
QT使用中...
离线shiroki

只看该作者 3楼 发表于: 2009-06-01
1> 把ui里的类放在一个namespace里, 为了防止ui生成的类和用户定义的类名字冲突
2> 没有关系。 Dialog是你在designer中命名的窗体的objectName来的, DialogClass最终生成的是Dialog里的一个对象。
3> 前面的说的很对, 是在setupUi里调了的。
--
shiro is White
ki is tree
http://www.cuteqt.com
论坛 http://www.cuteqt.com/bbs
博客 http://www.cuteqt.com/blog
博客镜像: http://sites.cuteqt.com/cuteqt
Linux/Qt/嵌入式讨论群 http://qun.qq.com/air/5699823
离线ssww
只看该作者 4楼 发表于: 2009-06-01
谢谢,清楚了,原来这个函数setupUi的声明就是:void setupUi(QDialog *QQLoginDlgClass);这个QQLoginDlgClass只是一个QDialog类型的指针变量名,跟那个namespace Ui { class DialogClass: public Ui_DialogClass {};}其实是两码事。一开始没有仔细看代码,不过,奇怪的是居然这两个名字弄一样的,一开始就很自然地将这两个QQLoginDlgClass联系起来了。
快速回复
限100 字节
 
上一个 下一个