Qt编程中,Ui文件如何被利用
这两天跟着班级辅导,总有学生感到很疑惑,用ui designer设计出来的ui文件是如何使用的,下面我从一个例子来说明下,希望能对有这样疑惑的同学有帮助。
事实上,现在有了继承设计工具qtcreator,作为开发者再也不用考虑这个问题,因为当你用qtcreator创建一个工程的时候,qtcreator提供的框架已经替我们完成了这个任务。
咱们先从这个程序开始看:
新建一个工程,
在这个工程中用ui designer来设计了这样的一个界面
这是我按ctrl+alt+r运行出来的,如何使这个利用ui designer设计出来的ui文件能运行起来就是我们这篇文章要议论的内容。
先来看看qtcreator提供的默认框架是如何实现的。要研究qtcreator怎么实现,就得先看dialog.h这个文件。
#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 dialog.ui –o tt.h
就生产了下面的文件:
/********************************************************************************
** Form generated from reading UI file 'dialog.ui'
**
** Created: Sun May 9 17:29:42 2010
** by: Qt User Interface Compiler version 4.6.2
**
** 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;
font.setPointSize(12);
font.setBold(true);
font.setWeight(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_dialog.h的文件,此文件中包含Ui_Dialog的类。
那么总结出来,要让ui design设计出来的界面显示出来,只要能设法调用Ui_Dialog类的setupUi函数就行了。
一种简单的方法,直接使用,重新写一个这样的main函数。
#include <QtGui/QApplication>
#include <QDialog>
#include "ui_dialog.h"
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
Ui::Dialog ui;
QDialog *d=new QDialog;
ui. setupUi(d);
d->show();
return a.exec();
}
第二种方法相对比较简单一点,就是将Ui::Dialog ui或Ui::Dialog *ui写成一个新定义类的一个数据成员,也就是qtcreator提供的那种方法。
#include <QDialog>
#include "ui_dialog.h"
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_dialog.h"
class Dialog : public QDialog ,public Ui::Dialog
{
Q_OBJECT
public:
Dialog(QWidget *parent = 0);
};
实现如下:
#endif // DIALOG_H
#include "dialog.h"
#include "ui_dialog.h"
Dialog::Dialog(QWidget *parent) :
QDialog(parent),
Ui::Dialog()
{
setupUi(this);
}
希望通过讲解,大家能总结出该如何使用ui文件。无非就是利用默认工具uic自动产生的类,去调用该类的setui函数。第一种是直接使用,第二种是定义一个新类,声明一个ui子对象,第三种是将ui作为基类派生新的类。
http://blog.csdn.net/zyx_linux/article/details/23370043
Qt编程中,Ui文件如何被利用的更多相关文章
- [转]Qt中ui文件的使用
用designer设计的*.ui文件可以通过uic工具转换为*.h文件(在编译时也会自动生成这样一个ui_*.h文件),有了这个.h文件就可以直接按照纯C++的方式对其中的类进行调用.ui文件的使用就 ...
- Visual Studio下Qt编程中对中文的处理
Visual Studio下Qt编程中对中文的处理 本文为原创文章,原文地址http://www.cnblogs.com/c4isr/p/qt_develop_in_vs.html Visual St ...
- Qt Designer设计 UI 文件并调用
本文介绍的是Qt Designer设计 UI 文件并调用,在坛子里逛了一圈,关于UI方面的好像不怎多,本篇给大家分享一下. AD: 2013云计算架构师峰会超低价抢票中 Qt Designer设计 U ...
- 在windows下的QT编程中的_TCHAR与QString之间的转换
由于在windows下的QT编程中,如果涉及到使用微软的API,那么不可避免使用_TCHAR这些类型,因此在网上查了一下,其中一个老外的论坛有人给出了这个转换,因此在这里做一下笔记 : )#ifdef ...
- qt creator 使用Ui文件的问题
一.显式地调用uic.exe 如何将UI文件生成头文件 1,将设计的UI文件拷贝到uic.exe的目录下Qt\Qt5.3.2\5.3\mingw482_32\bin. 2, 打开windows的CMD ...
- Qt 手动添加ui文件到工程(转)
制作ui文件 先应该用Qt Designer绘制一个自己的界面,并存为myform.ui(这里的myform可以用自己喜欢的名字代替).在制作自己的界面文件时要注意以下几个要点: 1.要记住ui文件的 ...
- Qt探秘——谈ui文件的用法
转载自:点击打开链接http://blog.csdn.net/luo_isaiah/article/details/5794973 相信用过Qt Designer的朋友,对Qt Project中的.u ...
- eric6中ui文件编译失败,提示找不到puicc5
1解决办法 在setting中——preference 找到qt设置——pyQT工具文件选择更改为: 我的pyuicc5.exe文件在这个目录下 然后右击编译窗口,就成功了. 如果找不到ui文件,在窗 ...
- QT笔记 -- (1) .ui文件
刚开始写QT,designer用的不习惯,打开.ui文件看了一下,很容易读的xml文件,记录一下. 大体框架如下 <?xml version="1.0" encoding=& ...
随机推荐
- CATransition类动画
- (void)leftClick { [UIView beginAnimations:nil context:nil]; //display mode, slow at beginning and ...
- 简单使用SimpleCursorAdapter
http://my.oschina.net/javaeye/blog/14846 果使用Sqlite,建议和ContentProvider结合使用.这样数据库的生命周期就不用自己管了.然后,如果要在比 ...
- HTML静态网页(框架)
1.frameset frameset最外层,使用时需要去除body改用frameset. <frameset rows="100,*" frameborder=" ...
- 根据checkBox或radio的勾选状态得到id数组
$(function(){ var inputs = document.getElementsByTagName("input"); var realStrs = "&q ...
- hdu2141
题目大意:输入三系列数A,B,C,输入一个数X,问是否在A,B,C中存在A[i]+B[j]+C[k]=X,存在输出YES,不存在输出NO. 本题若果采用暴力法那么复杂度为O(n3)显然会超时,如果把A ...
- ButterKnife 绑定 RadioGroup
原则上 ButterKnife 是不支持 RadioGroup 的, 可以通过以下方法添加RadioButton的点击事件: @OnClick({ R.id.radio_btn1, R.id.radi ...
- Zencart先生成订单后付款,类似淘宝后台修改订单价格
Zencart 使用 Paypal 付款,会出现漏单的情况,即 paypal 已经收到客户的付款,但是网站后台没有客户的订单.导致 paypal 漏单的原因大致会是当客户跳转到Paypal 网站付款完 ...
- C#数据库——用多线程来组合一个SQL语句
StringBuffer sql = new StringBuffer();或(StringBuilder sql = new StringBuilder ()) sql.Append("s ...
- object-c 协议(Protocols)和代理(Delegation)的学习
代理是Object-C中的一个重要机制,他可以将面向对象编程的封装特性进一步加强,不是自己负责的事情坚决不做,而是转而让对应的事情负责人(代理)去做.相反如果是自己需要负责的事情(作为别人的代理),会 ...
- sping+maven+mybatis+ehcache续之实现mapper
配置接着上一篇文章 新建UserMapper.java和UserMapper.xml 其中UserMapper.xml的namespace以及文件名要和UserMapper.java一致 <ma ...