Qt中的新手问题

MainWindow::MainWindow(QWidget *parent) :  
    QMainWindow(parent),  
    ui(new Ui::MainWindow)  
{  
    ui->setupUi(this);  
}
在这段代码中,
:
之后是什么
QMainWindow(parent),
ui(new Ui::MainWindow)  
意思?     
已邀请:
这实际上是一个C ++问题。您正在查看的内容称为初始化列表。
QMainWindow(parent)
MainWindow
的超类(
QMainWindow
)和
ui(new Ui::MainWindow)
构造函数构成
ui
成员。     
通过进一步说明,观察用户界面编译器生成的类也被调用(在这种情况下)
MainWindow
,但它属于命名空间
Ui
,因此它的全名是
Ui::MainWindow
。这显然与继承自
QMainWindow
MainWindow
类不同。但是,
QMainWindow
派生类有一个成员指针(称为
ui
)到一个
Ui::MainWindow
,它在构造函数中初始化,如上所述。看看uic生成的文件
ui_mainwindow.h
,看看所有部分是如何组合在一起的。另请注意,
Ui::MainWindow
的成员都是公开的,因此可在
MainWindow
内完全访问。 另一种设计是使用多重继承合并两个
MainWindow
类的标识,从
QMainWindow
Ui::MainWindow
得到你自己的
MainWindow
。但是,当前版本的QtCreator生成的代码遵循组合模式而不是继承模式。     
这两行是所谓的初始化列表,并在该类的每个实例的“创建”时执行。继承另一个类的每个类都应包含对此列表中超类的构造函数的调用。 你也可以这样写:
MainWindow::MainWindow(QWidget *parent) :  
    QMainWindow(parent)
{  
    ui = new Ui::MainWindow();
    ui->setupUi(this);  
}
哪一个可以找到更好的可读性。但是使用初始化列表稍微快一些,并且正在由编译器进行优化。请注意,这些列表只能在构造函数中使用,并且您无法调用该对象的任何函数 - 因为它尚未“生存”。但是您可以设置某些属性的值并在以下语句中引用它们(例如,为了避免代码冗余),如下例所示:
#define DEFAULT_VALUE 1.0

class MyClass {

public:
    MyClass() :
        value1(DEFAULT_VALUE),
        value2(value1)
    {
    }

    MyClass(qreal value) :
        value1(value),
        value2(value1)
    {
    }

private:
    qreal value1;
    qreal value2;
};
请注意,如果初始化列表中成员的顺序与类定义中的顺序不匹配,则大多数编译器会向您发出警告。     

要回复问题请先登录注册