把UIC.exe和你要转换的xxx.ui文件拷贝到同一目录。
开始菜单,运行CMD
进入uic.exe和xxx.ui的目录,运行以下命令:
uic xxx.ui -o xxx.h 生成.h文件
uic xxx.ui -i xxx.h -o xxx.cpp 生成.cpp文件
生成头文件没问题,但在生成cpp文件时,给了这么个提示(如图),并且没有生成.cpp文件!
我是在qt designer中设计的ui,项目是在vs2010里创建的..
ui 文件是不会生成.cpp文件的.ui文件就会生成一个ui_***.h文件. 有了这个ui_***.h文件就足够了.里面已经包含了所有的布局信息.
详细说明了在应用程序中使用UI文件的方法。
一、直接的方法(The Direct Approach)
即把filename.ui经过uic转换后的C++代码文件ui_filename.h直接包含,使用其里面Ui命名空间下的类(名称和主窗体的objectname相同,这里假设为GoToCellDialog)。
#include "ui_gotocelldialog.h" // uic工具将gotocelldialog.ui生成的C++代码 int main(int argc, char *argv[]) { QApplication app(argc, argv); QDialog *dialog= new QDialog; // 用于显示界面的父窗体QDialog(QWidget的子类) Ui::GotoCellDialog ui; // 界面类,必须显示在一个QWidget(或其子类)上 ui.setupUi(dialog); // 将QDialog设置为 GotoCellDialog 的父窗体,这样GotoCellDialog 里面定义的控件就会显示在QDialog窗体内 dialog->show(); return app.exec(); }
二、单继承方式(The Single Inheritance Approach)
单继承方式是相对于后面要讲的多继承方式,单继承方式也称组合(即委托或代理)方式。单继承方式简单来说就是在代码中首先要自定义一个子类(例如下文中的GoToCellDialog类),该类要从form对应的窗体类(或其兼容的子类)派生;并用ui生成的类定义一个类里的成员变量,该成员变量可以是值也可以是指针,根据使用成员变量的形式不同,又分为成员变量和指针成员变量两种形式。这样在GoToCellDialog的构造函数中可以直接调用ui和ui中的变量和函数,使用起来很方便。
1、使用成员变量
即将 Ui::GotoCellDialog ui; 作为类GotoCellDialog(只继承自QDialog,单一继承)的成员变量。这里有一点值得注意的地方,就是ui文件提供的类被包含在了名为Ui的name space里,这样做的目的是将ui文件的命名空间与用户的代码分离,避免两者出现命名冲突的情况。
头文件: gotocelldialog.h
#include <QDialog> #include "ui_gotocelldialog.h" // 因为是成员变量形式,必须包含相应的头文件 class GoToCellDialog: public QDialog { Q_OBJECT public: explicit GoToCellDialog(QDialog *parent = 0); private slots: void on_lineEdit_textChanged(); private: Ui::GoToCellDialog ui; };
实现文件: gotocelldialog.cpp
#include "gotocelldialog.h" #include <QtGui> GoToCellDialog::GoToCellDialog(QWidget *parent) : QDialog(parent) { ui.setupUi(this); QRegExp regExp("[A-Za-z][1-9][0-9]{0,2}"); lineEdit->setValidator(new QRegExpValidator(regExp, this)); connect(okButton, SIGNAL(clicked()), SLOT(accept())); connect(cancelButton, SIGNAL(clicked()), SLOT(reject())); } void GoToCellDialog::on_lineEdit_textChanged() { // bool hasAcceptableInput () const // This property holds whether the input satisfies the inputMask and the validator. // By default, this property is true. okButton->setEnabled(lineEdit->hasAcceptableInput()); }
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; // 切记删除,释放资源
}
三、多继承方式(The Multiple Inheritance Approach)
多继承方式就是自定义的类从窗体类和Ui类多重派生。看代码就清楚了:
头文件:
#ifndef GOTOCELLDIALOG_H #define GOTOCELLDIALOG_H #include <QDialog> #include "ui_gotocelldialog.h" class GoToCellDialog : public QDialog, public Ui::GoToCellDialog { Q_OBJECT public: explicit GoToCellDialog(QWidget *parent = 0); private slots: void on_lineEdit_textChanged(); }; #endif // GOTOCELLDIALOG_H实现文件:
#include "gotocelldialog.h" #include <QtGui> GoToCellDialog::GoToCellDialog(QWidget *parent) : QDialog(parent) { this->setupUi(this); //第1个this指Ui::GoToCellDialog,第2个this指(QDialog) 即 Ui::GoToCellDialog->setupUi(QDialog) QRegExp regExp("[A-Za-z][1-9][0-9]{0,2}"); lineEdit->setValidator(new QRegExpValidator(regExp, this)); connect(okButton, SIGNAL(clicked()), SLOT(accept())); connect(cancelButton, SIGNAL(clicked()), SLOT(reject())); } void GoToCellDialog::on_lineEdit_textChanged() { // bool hasAcceptableInput () const // This property holds whether the input satisfies the inputMask and the validator. // By default, this property is true. okButton->setEnabled(lineEdit->hasAcceptableInput()); }