Qt - 事情如何协同工作?

时间:2011-04-17 11:02:45

标签: c++ qt

下面,我将从C++ GUI Programming with Qt 4一书中展示应用程序的不同文件,并对它们提出一些问题。

的main.cpp

#include <QApplication>
#include "gotocelldialog.h"
//#include <QDialog>
//#include "ui_gotocelldialog.h"
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
//Ui::GoToCellDialog ui;
//QDialog *dialog = new QDialog;
GoToCellDialog *dialog = new GoToCellDialog;
//ui.setupUi(dialog);
dialog->show();
return app.exec();
}

gotocelldialog.h

#ifndef GOTOCELLDIALOG_H //Check if GOTOCELLDIALOG_H has not been defined previously
#define GOTOCELLDIALOG_H
#include <QDialog>
#include "ui_gotocelldialog.h"
class GoToCellDialog: public QDialog, public Ui::GoToCellDialog
{
Q_OBJECT
public:
GoToCellDialog(QWidget *parent = 0); 
private slots:
void on_lineEdit_textChanged();
};
#endif

gotocelldialog.cpp

#include <QtGui>
#include "gotocelldialog.h"
GoToCellDialog::GoToCellDialog(QWidget *parent): QDialog(parent)
{
setupUi(this); //this: reference to the current class
QRegExp regExp("[A-Za-z][1-9][0-9]{0,2}");
QValidator *validator = new QRegExpValidator(regExp, this);
lineEdit->setValidator(validator);
connect(okButton, SIGNAL(clicked()),this, SLOT(accept()));
connect(cancelButton, SIGNAL(clicked()), this, SLOT(reject()));
}
void GoToCellDialog::on_lineEdit_textChanged()
{
okButton->setEnabled(lineEdit->hasAcceptableInput());
}

1-将GoToCellDialog(QWidget *parent = 0);放在 gotocelldialog.h 中有什么用,特别是它不允许传递父项?

2-在 main.cpp 中,评论代码ui.setupUi(dialog);明确显示了我要设置对话框的ui。但是,在 gotocelldialog.cpp 中,您将看到setupUi(this);而未确定我想要设置当前对象的ui。这是怎么用的?而且,在这种情况下设置用户界面意味着什么?

3-在 gotocelldialog.cpp 中,这行是什么意思? GoToCellDialog::GoToCellDialog(QWidget *parent): QDialog(parent)。我不清楚我们如何在这里传递父母。我们如何从这一行确定父母?

4-在 gotocelldialog.cpp 中,还有另一种写这一行的方法:GoToCellDialog::GoToCellDialog(QWidget *parent): QDialog(parent)?而且,如果我们删除构造函数,我们怎么能写它呢?它只能以GoToCellDialog {...}开始吗?

非常感谢您的努力。

2 个答案:

答案 0 :(得分:1)

For 1):这是基本的C ++语法。这是默认参数。它可以在不传入指针的情况下调用构造函数,在这种情况下,0(即NULL)将被替换。

For 2):请阅读UI文件的Qt文档。那是在那里解释的。 (http://doc.qt.nokia.com/latest/designer-using-a-ui-file.html)(具体含义:请阅读以前问题的答案,{{1}生成的代码} 并阅读文档)。

对于3):这也是基本的C ++。它以uic为参数调用超类的构造函数。

For 4):不,你不能以你想要的方式编写C ++。语法是严格的,你必须遵循它。

请在互联网上搜索C ++信息和教程,那里有数以百计的好参考资料。

答案 1 :(得分:0)

抱歉,我不知道如何回答你的第二个问题,但我会尝试回答别人的问题。

1) - 如果 parent 为0,则新窗口小部件(在我们的例子中为gotocelldialog)将成为一个窗口。如果指定了 parent 小部件,则创建的小部件将成为父级内的子窗口。当删除时,也会删除子窗口小部件。

3)GoToCellDialog类来自QDialog类,它有一个构造函数QDialog(QWidget * parent = 0)。在这一行中,您使用 parent 初始化基础对象,该对象已传递给GoToCellDialog的ctor。

4)是的,你可以写这样的东西:

GoToCellDialog(QWidget * parent){...}

但是在这种情况下,您将错过在构造阶段将ctated GoToCellDialog对象设置为其他窗口小部件的子窗口的机会,因为QDialog基础对象将在其ctor中使用QWidget * parent参数的默认值,即0(请参阅第1项) )。