qt 中 怎样在ui里面qt使用多个ui文件qpainter

15320人阅读
&&&&&&& 使用Qt有一些时间了,一直在IDE环境(qtcreator和VS2003+集成器)中使用,自然少了很多麻烦的步骤。但是在享受这种便利的同时,我们也失去了理解更多知识背后的点滴。在IDE中,如果我们要开发一个对话框,通常是使用 “新建—&Qt—&Qt设计师界面类” 这样IDE会自动的帮我们生成三个文件(filename.ui, filename.h,filename.cpp)。qmake也非常智能,可以自动检测到这个用户界面文件(filename.ui)并且生产适当的makefile规则。这样在编译之前,IDE会自动调用uic(Qt自带的用户界面编译器,User
Interface Compiler)将界面文件(filename.ui)转换成C++代码并保存在ui_filename.h文件中。并且在另外两个C++源文件(filename.h和filename.cpp)中使用了组合(即委托或代理)的方式使用了ui_filename.h里的类(该类通常定义在命名空间Ui下)。
&&&&&&&&如果你不主动的留心这些细节,你可能永远都不明白这些,即使使用了多年的Qt,我就是这样。一次,项目组的需求人员嫌弃我们开发人员做的界面布局不够恰当,美观。于是有了自己来开发界面的想法。很好!开发人员很快手把手的教会了需求人员用Qt Designer设计窗体界面,然而,等到需求人员把 pureui_filename.ui文件扔给我们开发人员使用时,我们顿时傻了眼,怎么用?于是使用了一个最愚蠢当然也是最简单的办法: 还是和之前一样,通过IDE“新建—&Qt—&Qt设计师界面类”生成与“pureui_filename.”同名的文件,然后用需求人员给的pureui_filename.ui替换IDE自动生成的
*.ui 文件。虽然转了一个小弯,但目的达到!
&&&&&& 后来想想,总觉得多少有些遗憾,于是查阅了Qt文档之Using a Designer UI File in Your Application
&&&&&& 在这个文档中,详细说明了在应用程序中使用UI文件的方法。
一、直接的方法()
&&&& 即把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 QD
// 用于显示界面的父窗体QDialog(QWidget的子类)
Ui::GotoCellD
// 界面类,必须显示在一个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::GotoCellD 作为类GotoCellDialog(只继承自QDialog,单一继承)的成员变量。这里有一点值得注意的地方,就是ui文件提供的类被包含在了名为Ui的name space里,这样做的目的是将ui文件的命名空间与用户的代码分离,避免两者出现命名冲突的情况。
头文件: gotocelldialog.h
#include &QDialog&
#include &ui_gotocelldialog.h& // 因为是成员变量形式,必须包含相应的头文件
class GoToCellDialog: public QDialog
explicit GoToCellDialog(QDialog *parent = 0);
private slots:
void on_lineEdit_textChanged();
Ui::GoToCellD
实现文件: 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 *
因此,相应的头文件中只要前置声明即可:
namespace Ui
class GoToCellD
} // 前置声明即可,只在实现文件中包含相应的头文件
class GoToCellDialog: public QDialog
Ui::GoToCellDialog *
实现文件:
#include &ui_gotocelldialog.h&
GoToCellDialog::GoToCellDialog(QDialog *parent) :
QDialog(parent), ui(new Ui::GoToCellDialog)
ui-&setupUi(this);
CalculatorForm::~CalculatorForm()
// 切记删除,释放资源
&三、多继承方式(The Multiple Inheritance Approach)
&&&&&&& 多继承方式就是自定义的类从窗体类和Ui类多重派生。看代码就清楚了:
#ifndef GOTOCELLDIALOG_H
#define GOTOCELLDIALOG_H
#include &QDialog&
#include &ui_gotocelldialog.h&
class GoToCellDialog :
public QDialog, public Ui::GoToCellDialog
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());
PS:关于UI界面中的国际化
&&&&&& 如果用户界面语言发送了改变,Qt通过发送 QEvent::LanguageChange 事件通知应用程序。为了调用 retranslateUi() 函数以达到切换语言的目的,我们需要重新实现界面类里面的QWidget::changeEvent() 事件处理函数。
Reacting to Language Changes
Qt notifies applications if the user interface language changes by sending an event of the type&. To call the member
function&retranslateUi()&of the user interface object, we reimplement&QWidget::changeEvent()&in the form class, as follows:
void CalculatorForm::changeEvent(QEvent *e)
QWidget::changeEvent(e);
switch (e-&type()) {
case QEvent::LanguageChange:
ui-&retranslateUi(this);
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:180399次
积分:2798
积分:2798
排名:第8950名
原创:100篇
转载:22篇
评论:32条
(1)(4)(3)(2)(6)(2)(1)(3)(2)(1)(3)(7)(1)(1)(2)(1)(5)(11)(10)(14)(1)(25)(2)(3)(5)(6)Qt中怎么给一个用drawLine绘制的封闭的多边形的填充颜色 - QT开发当前位置:& &&&Qt中怎么给一个用drawLine绘制的封闭的多边形的填充Qt中怎么给一个用drawLine绘制的封闭的多边形的填充颜色&&网友分享于:&&浏览:195次Qt中如何给一个用drawLine绘制的封闭的多边形的填充颜色?本帖最后由 luohao1213 于
17:13:03 编辑
最近因为工作需要,刚接触Qt不久,最近就遇到了这样一个问题。
如图,在一个圆内,蓝色线圈起的区域是用drawLine()把360个点连起来的不规则的封闭图形,我试着用setBrush()设置,但是还是没效果。因为对Qt不是很熟练,想请教下各位可以有什么解决方法。
(我的意思就是把这个蓝色区域里的颜色填充成单一的颜色,比如蓝色)
我的设置方法是在设置画笔的时候就设置画刷:
painter.setPen(QPen(Qt::blue,1,Qt::SolidLine));
painter.setBrush(QBrush(Qt::blue,Qt::SolidPattern));
这样设置没效果。
是不是我不该用drawLine来连线呢?
请各位多多帮忙哈!
------解决方案--------------------
void&QPainter::drawPath&(&const&QPainterPath&&&path&)
void&QPainter::fillPath&(&const&QPainterPath&&&path,&const&QBrush&&&brush&)
就ok了。。
何不用第三方控件呢。。
ChartDirector&完全满足你的要求。。有破解版(哈哈)
这是一个简单例子。------解决方案--------------------用QPolygon可以实现。
PolygonWidget::PolygonWidget(QWidget&*parent)&:&QWidget(parent),&ui(new&Ui::PolygonWidget)&{
&&&&ui-&setupUi(this);
&&&&polygon&&&&QPoint(20,&20);
&&&&polygon&&&&QPoint(122,&25);
&&&&polygon&&&&QPoint(130,&120);
&&&&polygon&&&&QPoint(140,&150);
&&&&polygon&&&&QPoint(20,&110);
&&&&polygon&&&&QPoint(0,&50);
PolygonWidget::~PolygonWidget()&{
&&&&delete&
void&PolygonWidget::paintEvent(QPaintEvent&*event)&{
&&&&Q_UNUSED(event);
&&&&QPainter&painter(this);
&&&&painter.setBrush(Qt::red);
&&&&painter.drawConvexPolygon(polygon);
12345678910
12345678910
12345678910 上一篇:下一篇:文章评论相关解决方案 12345678910 Copyright & &&版权所有如何在槽函数中引用Qt UI界面中设计出来的元件?_百度知道
如何在槽函数中引用Qt UI界面中设计出来的元件?
ui.h头文件. 生成的头文件当中没有任何关于这个QPushButton的信息,比如声明QPushButton *enterButton?(比如希望设置其enabled属性为false)
P,但此处作声明的话,它会默认是UI界面中的按钮吗,它又需要new再开辟空间吗,工程自动生成了一个list以“Qt设计师界面类”形式添加了一个UI界面文件list,如何在槽函数中引用这个按钮呢?如果是。
假设上面有一个按钮名(objectName)为enterButton ,又觉得有点问题.S,当右键点击“转到槽”后
提问者采纳
就可以了包括 你其他的的控件,你直接在lish.setEnabled(true);enterButton.cpp文件里面用ui-&gt不用
的确如此,谢谢!再追问一下,如果点击这个enterButton使另一个list2.ui界面中的某个按钮acceptButton失效enabled(false)的话,在list中应该怎么引用list2的元件呢?(list.ui和list2.ui是整个工程下的两个类)
//你先得在list里初始化list2的一个实例list2 l2;l2.acceptButton-&setEnabled(false);就可以 了
提问者评价
好的,再次感谢~
来自团队:
其他类似问题
为您推荐:
您可能关注的推广
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁&&&&&具体是这样
&&&&&&&我创建了一个工程
&&&&&&&文件内容大概:robot.cpp,&robot.h,&robot.ui,&main.cpp
然后我在原有的工程中新增加了一个设计师界面类:文件有:calc.h,&calc.cpp,&calc.ui
&&&&&&&其实我想做的是:在robot.ui界面上有个lineEdit&文本输入框,当我鼠标点击编辑框后,弹出一个界面(就是我新增加的界面calc.ui),calc.ui界面我主要用来布局0-9的数字输入按钮面板。(因为我要移植到手持盒上面去,是没有接键盘的,因此我需要设计一个数字输入面板)
&&&&&&&如何将鼠标一点击文本框,就弹出来calc.ui,我已经实现了,用鼠标按钮事件....
&&&&&&&各位大神,我的问题来了,如何在弹出的界面(calc.ui)上进行按键将0-9个数字,输入到robot.ui这个界面上的lineEdit文本框上面去?
&&&&&&&问题描述的可能不太清楚(表达能力有限),说白了,就是在calc.cpp&里面怎么访问robot.ui里面的界面按钮,编辑框什么的。。
&&&&&&之前想过信号和槽来实现,但是我无法访问资源,我实例化了也不行(也有可能我实例化有问题)
回复讨论(解决方案)
建议把代码贴出来,看病总得见病人是吧。
#inclde&&ui_robot.h&或者&&ui_calc.h&什么的。
然后试试能访问到你的窗口吗?只要能找到窗口的指针,没有说访问不到的。逻辑可以C++的强项啊。别给我说你没有设置一个成员变量或者全局变量的来保存对方的指针哦。。。
在calc窗口里面给lineEdit发事件也可以。
用信号槽呢。&当你lineedit编辑的时候。把当前的字符串内容发过去就好了。
在calc.cpp&里面new一个robot.ui的类&&就可以访问了
用信号槽完全可以实现,calc.ui点击数字时发送信号给robot.ui,在robot.ui的相关槽中实现对lineEdit的编辑
用信号槽完全可以实现,calc.ui点击数字时发送信号给robot.ui,在robot.ui的相关槽中实现对lineEdit的编辑
在按键的槽中向robot发信号,将按键信息作为参数发送过去
我做过跟你这个类似的模块.我实现的办法是这样的.
1:数字键盘单独设计个类,继承QFrame,比如叫做:numpan然后自己拖拽按钮布局等等数字键盘设计完成.
2:欲实现的效果是在主界面有个文本框,点击之后数字键盘弹出.那么我就在主界面上面拖拽一个QFrame,比如叫做:numframe,然后选中鼠标右击使得numframe提升为numpan类,这样这个numframe就具有了numpan的一切特性了.
3:在主界面点击文本框之后,就可以直接自定义点击的槽函数了,通过ui-&numpan这样去调用这个数字键盘的显示隐藏还有赋值等等.
附上效果图如下:
附上我自定义表盘的类定义代码,你可以参考,我感觉按照我的思路可以帮到你.
#ifndef&NUMPAN_H
#define&NUMPAN_H
#include&&QFrame&
#include&&QLabel&
#include&&injlineedit.h&
#include&&dialpan.h&
#include&&mainwindow.h&
//#include&&msgthread.h&
namespace&Ui&{
&&&&class&
class&numpan&:&public&QFrame
&&&&Q_OBJECT
&&&&explicit&numpan(QWidget&*parent&=&0);
&&&&~numpan();
&&&&//打开键盘
&&&&void&openNumPan();
&&&&//关闭键盘
&&&&void&closeNumPan();
&&&&//设置标志位
&&&&void&setOpenCloseFlag(bool&flag);
&&&&//取得标志位
&&&&bool&getOpenCloseFlag();
&&&&//设置键盘类型
&&&&void&setType(int&type);
&&&&//获得键盘类型
&&&&int&getType();
&&&&void&cal(int&num);
&&&&//设置显示的label
&&&&void&setShowTextLabel(injlineedit&*label);
&&&&//取得显示的label
&&&&injlineedit&*getShowTextLabel();
&&&&//显示框的值
&&&&double&
//&&&&msgthread&
&&&&//动态表盘设置
&&&&void&setDialPan(dialpan&*pan);
&&&&dialpan&*getDialPan();
&&&&void&showPan(int&pantype,&double&value);
&&&&void&updatePan();
&&&&//设置mainwindow出现警告提示
&&&&void&setMainWindow(mainwindow&*m);
&&&&mainwindow&*getMainWindow();
&&&&Ui::numpan&*
&&&&//打开关闭的标志位
&&&&injlineedit&*
&&&&//动态表盘
&&&&dialpan&*
&&&&mainwindow&*m;
private&slots:
&&&&/*数字键盘slots*/
&&&&//&&&&'C'键处理
&&&&void&on_numkeyclear_clicked();
&&&&//&&&&'.'键处理
&&&&void&on_numkeydot_clicked();
&&&&//&&&&按键0处理
&&&&void&on_numkey0_clicked();
&&&&//&&&&按键1~9处理
&&&&void&on_numkey1_clicked();
&&&&void&on_numkey2_clicked();
&&&&void&on_numkey3_clicked();
&&&&void&on_numkey4_clicked();
&&&&void&on_numkey5_clicked();
&&&&void&on_numkey6_clicked();
&&&&void&on_numkey7_clicked();
&&&&void&on_numkey8_clicked();
&&&&void&on_numkey9_clicked();
&&&&void&sig_bell();
#endif&//&NUMPAN_H
在calc.cpp&里面new一个robot.ui的类&&就可以访问了
反过来在robit.h中为robit类添加一个calc的类成员,相互关联起来使用信号和槽就行了
谢谢大家,还是自己研究好了!
楼主解决了吗&同求啊qt creator设计ui后怎么在程序中调用部件?
qt 5.1 界面直接拖拉部件,目的:设计2个文本框,输入数字,按下按钮,在第三个文本框输出数字和,界面有了,就是不知道怎么在main中引用部件,求答案
请独立完成作业....
比如ui里有个textEdit部件, ui-&textEdit 就是指向该部件的指针。(这种问题自己google比较好
已有帐号?
无法登录?
社交帐号登录

我要回帖

更多关于 qt 如何使用ui的控件 的文章

 

随机推荐