如何使用ui文件

如何使用ui文件,第1张

这两天跟着班级辅导,总有学生感到很疑惑,用ui designer设计出来的ui文件是如何使用的,下面我从一个例子来说明下,希望能对有这样疑惑的同学有帮助。
事实上,现在有了继承设计工具qtcreator,作为开发者再也不用考虑这个问题,因为当你用qtcreator创建一个工程的时候,qtcreator提供的框架已经替我们完成了这个任务。
咱们先从这个程序开始看:
新建一个工程,
在这个工程中用ui designer来设计了这样的一个界面
这是我按ctrl+alt+r运行出来的,如何使这个利用ui designer设计出来的ui文件能运行起来就是我们这篇文章要议论的内容。
先来看看qtcreator提供的默认框架是如何实现的。要研究qtcreator怎么实现,就得先看dialogh这个文件。
#ifndef DIALOG_H
#define DIALOG_H
#include <QDialog>
namespace Ui {
class Dialog;
}
class Dialog : public QDialog {
Q_OBJECT
public:
Dialog(QWidget parent = 0);
~Dialog();
protected:
void changeEvent(QEvent e);
private:
Ui::Dialog ui;
private slots:
void on_pushButton_clicked();
};
#endif // DIALOG_H
观察不难得出,在上文中我用红色包含的就是实现这个程序的关键。它声明一个类,将设计出来的ui界面作为该类的一个子对象,在其构造函数中,先完成对子对象的构造,再使用子对象ui调用其setupUi(this)函数实现ui的现实。
Dialog::Dialog(QWidget parent) :
QDialog(parent),
ui(new Ui::Dialog)
{
ui->setupUi(this);
}
看完上面的代码,我们来分析下到底为什么要这样来使用ui文件。
在没有qtcreator之前,给了我们一个ui文件,该如何调用?
针对于ui文件,不知道大家知不知道uic这个工具,这是qt继承的一个工具,它可以利用ui生产h文件。
uic dialogui –o tth
就生产了下面的文件:
/
Form generated from reading UI file 'dialogui'

Created: Sun May 9 17:29:42 2010
by: Qt User Interface Compiler version 462

WARNING! All changes made in this file will be lost when recompiling UI file!
/
#ifndef TT_H
#define TT_H
#include <QtCore/QVariant>
#include <QtGui/QAction>
#include <QtGui/QApplication>
#include <QtGui/QButtonGroup>
#include <QtGui/QDialog>
#include <QtGui/QHeaderView>
#include <QtGui/QLabel>
#include <QtGui/QPushButton>
QT_BEGIN_NAMESPACE
class Ui_Dialog
{
public:
QLabel label;
QPushButton pushButton;
void setupUi(QDialog Dialog)
{
if (Dialog->objectName()isEmpty())
Dialog->setObjectName(QString::fromUtf8("Dialog"));
Dialog->resize(115, 148);
label = new QLabel(Dialog);
label->setObjectName(QString::fromUtf8("label"));
label->setGeometry(QRect(10, 30, 91, 21));
QFont font;
fontsetPointSize(12);
fontsetBold(true);
fontsetWeight(75);
label->setFont(font);
pushButton = new QPushButton(Dialog);
pushButton->setObjectName(QString::fromUtf8("pushButton"));
pushButton->setGeometry(QRect(20, 80, 75, 23));
retranslateUi(Dialog);
QMetaObject::connectSlotsByName(Dialog);
} // setupUi
void retranslateUi(QDialog Dialog)
{
Dialog->setWindowTitle(QApplication::translate("Dialog", "Dialog", 0, QApplication::UnicodeUTF8));
label->setText(QApplication::translate("Dialog", "hello,wang", 0, QApplication::UnicodeUTF8));
pushButton->setText(QApplication::translate("Dialog", "close", 0, QApplication::UnicodeUTF8));
} // retranslateUi
};
namespace Ui {
class Dialog: public Ui_Dialog {};
} // namespace Ui
QT_END_NAMESPACE
#endif // TT_H
通过观察我们会发现uic自动将我们设计的ui文件,生成了一个类,在此例中为class Ui_Dialog。事实上也是这样,uic会自动会利用设计好的ui生成一个包含类Ui_的ui_h文件。那么在此例中,就会将我们设计好的dialog就会被uic文件解析,生成一个叫做ui_dialogh的文件,此文件中包含Ui_Dialog的类。
那么总结出来,要让ui design设计出来的界面显示出来,只要能设法调用Ui_Dialog类的setupUi函数就行了。
一种简单的方法,直接使用,重新写一个这样的main函数。
#include <QtGui/QApplication>
#include <QDialog>
#include "ui_dialogh"
int main(int argc, char argv[])
{
QApplication a(argc, argv);
Ui::Dialog ui;
QDialog d=new QDialog;
ui setupUi(d);
d->show();
return aexec();
}
第二种方法相对比较简单一点,就是将Ui::Dialog ui或Ui::Dialog ui写成一个新定义类的一个数据成员,也就是qtcreator提供的那种方法。
#include <QDialog>
#include "ui_dialogh"
class Dialog : public QDialog {
Q_OBJECT
public:
Dialog(QWidget parent = 0);
~Dialog();
protected:
void changeEvent(QEvent e);
private:
Ui::Dialog ui;
private slots:
void on_pushButton_clicked();
};
这样使用的时候需要注意的是在初始化的时候要先完成子对象的初始化,在其构造函数中重写构造函数。
Dialog::Dialog(QWidget parent) :
QDialog(parent),
ui(new Ui::Dialog)
{
ui->setupUi(this);
}
第三种方法是以Ui_Dialog类为基类,派生一个新类,在该类的初始化函数中调用setupUi。
#ifndef DIALOG_H
#define DIALOG_H
#include <QDialog>
#include "ui_dialogh"
class Dialog : public QDialog ,public Ui::Dialog
{
Q_OBJECT
public:
Dialog(QWidget parent = 0);
};
实现如下:
#endif // DIALOG_H
#include "dialogh"
#include "ui_dialogh"
Dialog::Dialog(QWidget parent) :
QDialog(parent),
Ui::Dialog()
{
setupUi(this);
}
希望通过讲解,大家能总结出该如何使用ui文件。无非就是利用默认工具uic自动产生的类,去调用该类的setui函数。第一种是直接使用,第二种是定义一个新类,声明一个ui子对象,第三种是将ui作为基类派生新的类。

最近在VS2017中开发QT的程序。在打开一个已存在的工程后,双击里面的ui文件没有反应。而在新建的工程中,双击ui文件时却能打开Qt Designer。后来发现通过重新添加ui文件的默认打开方式可以解决。解决步骤如下:


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/10245363.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-06
下一篇 2023-05-06

发表评论

登录后才能评论

评论列表(0条)

保存