我今天在新建新的QDialog类文件的时候很奇怪额发现了生成的东西里面居然没有了自动生成的xxx.h和xxx.cpp这两个“套餐文件”
emmmmm这个时候我就觉得很纳闷那我怎么样使用这个文件呢?开始上网搜有关的内容:
其中有一种方法说的就是用uic编译ui文件,uic xxx.ui -o ui_xxx.h
但是用这个方法呢,在我的mac下没有办法,terminal提示:uic command not found
那也就是说没有uic?
所以我就想了别的方法。
看看别人的说发:
单继承方式(The Single Inheritance Approach)
单继承方式是相对于后面要讲的多继承方式,单继承方式也称组合(即委托或代理)方式。单继承方式简单来说就是在代码中首先要自定义一个子类(例如下文中的GoToCellDialog类),该类要从form对应的窗体类(或其兼容的子类)派生;并用ui生成的类定义一个类里的成员变量,该成员变量可以是值也可以是指针,根据使用成员变量的形式不同,又分为成员变量和指针成员变量两种形式。这样在GoToCellDialog的构造函数中可以直接调用ui和ui中的变量和函数,使用起来很方便。
1、使用成员变量
即将 Ui::GotoCellDialog ui; 作为类GotoCellDialog(只继承自QDialog,单一继承)的成员变量。这里有一点值得注意的地方,就是ui文件提供的类被包含在了名为Ui的name space里,这样做的目的是将ui文件的命名空间与用户的代码分离,避免两者出现命名冲突的情况。
2、使用指针成员变量
与成员变量形式相似,唯一不同的是,将Ui::GoToCellDialog声明为指针成员,即 Ui::GoToCellDialog *ui;
因此,相应的头文件中只要前置声明即可:
namespace Ui
{
class GoToCellDialog;
} // 前置声明即可,只在实现文件中包含相应的头文件
class GoToCellDialog: public QDialog
{
// 同上
private:
Ui::GoToCellDialog *ui;
};
实现文件:
#include "ui_gotocelldialog.h"
GoToCellDialog::GoToCellDialog(QDialog *parent) :
QDialog(parent), ui(new Ui::GoToCellDialog)
{
ui->setupUi(this);
}
CalculatorForm::~CalculatorForm()
{
delete ui; // 切记删除,释放资源
}
还有一种就是多继承方式,就是使用C++的多继承
但是我在这里是这么实现的(怎么有种撞大运的感觉TT)
1:新建a.ui
2:新建同名a.h/a.cpp
3:建立的ui是什么类型的就是要继承什么类型的
然后把需要的东西都写好(就是在.h里面继承的,构造函数,Q_OBJECT这类的东西)
最后在a.cpp上面写#include "ui_a.h"
运行,发现没有报错,并且窗口可以显示!应该是QT里面的机制在编译时候发现在同名的ui上面,自动生成ui_xxx.h,所以才会比较奇怪没有这个文件却能;够运行。我觉得就是QT的运行机制的作用