下面,我将从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 {...}
开始吗?
非常感谢您的努力。
答案 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项) )。