MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
}
Run Code Online (Sandbox Code Playgroud)
在这部分代码中,之后:
做了什么
QMainWindow(parent),
ui(new Ui::MainWindow)
Run Code Online (Sandbox Code Playgroud)
意思?
通过进一步说明,观察用户界面编译器生成的类也被调用(在本例中)MainWindow
,但它属于命名空间Ui
,因此其全名是Ui::MainWindow
.这显然与MainWindow
继承的类不同QMainWindow
.但是,QMainWindow
-derived类有一个成员指针(被调用ui
)到a Ui::MainWindow
,它在构造函数中初始化,如上所述.看看uic生成的文件ui_mainwindow.h
,看看所有部分是如何组合在一起的.另请注意,成员Ui::MainWindow
都是公开的,因此可以完全访问MainWindow
.
另一种设计是合并这两个身份MainWindow
使用多重继承的类,派生自己MainWindow
来自QMainWindow
和Ui::MainWindow
.但是,当前版本的QtCreator生成的代码遵循组合模式而不是继承模式.
这两行是所谓的初始化列表,并在该类的每个实例的"创建"时执行.继承另一个类的每个类都应包含对此列表中超类的构造函数的调用.
你也可以这样写:
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent)
{
ui = new Ui::MainWindow();
ui->setupUi(this);
}
Run Code Online (Sandbox Code Playgroud)
哪一个可以找到更好的可读性.但是使用初始化列表稍微快一些,并且正在由编译器进行优化.请注意,这些列表只能在构造函数中使用,并且您无法调用该对象的任何函数 - 因为它尚未"生存".但是您可以设置某些属性的值并在以下语句中引用它们(例如,为了避免代码冗余),如下例所示:
#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;
};
Run Code Online (Sandbox Code Playgroud)
请注意,如果初始化列表中成员的顺序与类定义中的顺序不匹配,则大多数编译器会向您发出警告.
归档时间: |
|
查看次数: |
4303 次 |
最近记录: |