Qt自定义窗口部件Word下载.docx
《Qt自定义窗口部件Word下载.docx》由会员分享,可在线阅读,更多相关《Qt自定义窗口部件Word下载.docx(14页珍藏版)》请在冰点文库上搜索。
15.
textFromValue(int
value)
16.
17.private:
18.
QRegExpValidator
*validator;
19.};
20.
21.#endif
HexspinBox.cpp
1.#include
QtGui>
2.#include
"
hexspinbox.h"
3.HexSpinBox:
*parent)
4.
QSpinBox(parent)
5.{
6.
setRange(0,
255);
validator
new
QRegExpValidator(QRegExp("
[0-9A-Fa-f]{1,8}"
),
this);
8.}
9.
10.QValidator:
HexSpinBox:
const
11.{
12.
return
validator->
validate(text,
pos);
13.}
15.int
16.{
17.
bool
ok;
text.toInt(&
ok,
16);
19.}
21.QString
22.{
23.
QString:
number(value,
16).toUpper();
24.}
2、在需要开发的项目中的窗口中,
1、用QtDesigner创建一个新的窗体main.ui,把控件箱里的QSpinBox添加到窗体中。
2、右击微调框,选择“Promoteto”上下文菜单。
3、在弹出的对话框中,类名处填写“HexSpinBox”,头文件填写“hexspinbox.h”
好了。
在ui生成的包含有QSpinBox的控件文件中,ui的源代码里面多了一段
customwidgets>
<
customwidget>
class>
HSpinBox<
/class>
extends>
QSpinBox<
/extends>
header>
hspinbox.h<
/header>
/customwidget>
包含文件变为"
。
在QtDesigner中,QSpinBox表示的控件为HexSpinBox,并且可以设置所有的QSpinBox的属性。
可以在VS2008中编译一下main.ui文件,从ui_main.h源代码中可以知道,引入的控件是:
QtGui/QTableWidget>
QtGui/QToolBar>
QtGui/QWidget>
4.#include
hspinbox.h"
5.
6.QT_BEGIN_NAMESPACE
8.class
Ui_QMainClass
9.{
10.public:
QWidget
*centralWidget;
QPushButton
*pushButton;
QTableWidget
*tableWidget;
*spinBox;
HSpinBox
*hspinBox;
升级法的缺点是不能在QtDesigner中设置自定义控件自己的特有属性,也不能够绘制自己。
这些问题可以用插件法解决。
插件法
1.VS中创建Qt4DesignPlugin工程,名称叫custom
自动建立如下几个文件:
自定义控件:
custom.h,custom.cpp
插件:
customplugin.h,customplugin.cpp
源代码如下:
custom.h
CUSTOM_H
ui_test.h"
custom
8.public:
custom(QWidget
~custom();
11.private:
Ui:
Form
ui;
13.};
15.#endif
//
custom.cpp
custom.h"
2.
3.custom:
QWidget(parent)
ui.setupUi(this);
7.}
9.custom:
~custom()
10.{
12.}
customplugin.h
CUSTOMPLUGIN_H
3.
QDesignerCustomWidgetInterface>
6.class
customPlugin
QObject,
QDesignerCustomWidgetInterface
7.{
Q_INTERFACES(QDesignerCustomWidgetInterface)
11.public:
customPlugin(QObject
isContainer()
isInitialized()
QIcon
icon()
domXml()
group()
19.
includeFile()
name()
21.
toolTip()
22.
whatsThis()
*createWidget(QWidget
*parent);
24.
void
initialize(QDesignerFormEditorInterface
*core);
25.
26.private:
27.
initialized;
28.};
29.
30.#endif
customplugin.cpp
QtCore/QtPlugin>
customplugin.h"
4.customPlugin:
QObject(parent)
initialized
false;
10.void
customPlugin:
*/*core*/)
if
(initialized)
return;
true;
15.}
17.bool
18.{
20.}
22.QWidget
*customPlugin:
createWidget(QWidget
23.{
custom(parent);
25.}
26.
27.QString
28.{
custom"
;
30.}
31.
32.QString
33.{
34.
My
Plugins"
35.}
36.
37.QIcon
38.{
39.
QIcon();
40.}
41.
42.QString
43.{
44.
QString();
45.}
46.
47.QString
48.{
49.
50.}
51.
52.bool
53.{
54.
55.}
56.
57.QString
58.{
59.
widget
class=\"
custom\"
name=\"
>
\n"
60.
property
geometry\"
61.
rect>
62.
x>
0<
/x>
63.
y>
/y>
64.
width>
100<
/width>
65.
height>
/height>
66.
/rect>
67.
/property>
68.
/widget>
69.}
70.
71.QString
72.{
73.
74.}
75.
76.Q_EXPORT_PLUGIN2(custom,
customPlugin)
在其cpp的最后必须添加下面的宏:
·
10·
20·
30·
40·
50·
60·
70·
80·
90·
100·
110·
120·
130·
140·
150
1.Q_EXPORT_PLUGIN2(customWidgetPlugin,
CustomWidgetPlugin)
第一个参数为插件的名字,第二个是插件类的名字(而不是自定义控件的类名)
新建后,直接编译,会产生如下错误
1>
LINK:
fatalerrorLNK1181:
cannotopeninputfile'
QtDesignerd.lib'
这是因为此工程默认引用的是QtDesignerd.lib库,更改其为版本对应的库即可消除故障(VS2008是在项目的属性中Linker/input/AdditionalDependencies中修改,我这里Debug配置使用的是QtDesignerd4.lib,Release版本使用QtDesigner4.lib)。
3、使用自定义插件
1)、只需要把通过Release模式生成的
项目.lib和项目.dll文件拷到C:
\Qt\4.7.4\plugins\designer中,
2)、然后在QtDesigner中,选择菜单Help/AboutPlugin就可以看到你的自定义控件是否已经载入成功。
在QtDesigner中控件列表中有一项MyWidget中就有你的自定义控件。
参考:
1、
Qt自定义控件(插件)并添加到QtDesigher
打开QtDesigner,我们自定义的空间custom成功使用界面如下:
2010-01-1908:
56
7376人阅读
评论(0)
收藏
举报
qtmakefilewindows平台dll编译器
之前使用Qt的时候都是手写代码的(因为批量按钮可以使用数组实现),但当界面越来越复杂时,这种开发效率就太低了;
后来就开始使用QtDesigner,但要使QtDesigner支持我自己写的控件,需要提升或插件的形式(在<
C++GUIQt4编程(第二版)>
中有介绍).
结果看了之后,觉得提升的方式简单而不灵活,故使用插件法实现;
步骤如下:
[具体可参照第三方开源组件Qwt部件库的插件类的实现方式,个人感觉特别规范]
1.继承QObject和QDesignerCustomWidgetInterface实现插件类(或继承QObject和QDesignerCustomWidgetCollectionInterface实现多个自定义控件);
2.编写Qt平台无关的工程文件.pro(例如CustomWidgetPlugin.pro);
3.qmake
CustomWidgetPlugin.pro;
4.make(windows下vc平台使用nmake,如果发现缺少环境变量,可以运行其bin/vcvars32.bat配置环境)
先说说第一点:
继承后需要重写父类虚函数,原型如下:
[cpp]
viewplaincopy
Qt/qobject.h>
QtDesigner/QDesignerCustomWidgetInterface>
3.class
CustomWidgetPlugin:
4.{
必须
7.public:
CustomWidgetPlugin(QObject
构造函数,一般使其调用父类QObject的构造函数即可
返回由该插件提供的窗口控件的名字
返回由该插件封装的特定窗口控件的头文件的名称.
这个头文件会包含在由uic生成的代码中
返回自定义的窗口控件所属于的在QtDesigner里的组名,
如果QtDesigner没有则会自动创建
自定义控件在QtDesigner的图标
控件的"
提示"
这是什么"
控件是否包含其他控件,如果有则返回true,否则返回false
QtDesigner会调用这个函数创建自定义控件,返回创建的(C++中可能是new)自定义控件即可
17.};
再说说第二点:
.pro的参数和语法比较多,在网上可以搜到不少资料,在这里总结一下
1.
注释
从“#”开始,到这一行结束。
2.
指定源文件
SOURCES=*.cpp
对于多源文件,可用空格分开,如:
SOURCES=1.cpp2.cpp3.cpp
或者每一个文件可以被列在一个分开的行里面,通过反斜线另起一行,就像这样:
SOURCES=hello.cpp
/(续行符)
main.cpp
一个更冗长的方法是单独地列出每一个文件,就像这样:
SOURCES+=hello.cpp
SOURCES+=main.cpp
这种方法中使用“+=”比“=”更安全,因为它只是向已有的列表中添加新的文件,而不是替换整个列表。
3.
指定头文件
HEADERS=hello.h或者HEADERS+=hello.h
列出源文件的任何一个方法对头文件也都适用。
4.
配置信息
CONFIG用来告诉qmake关于应用程序的配置信息。
CONFIG+=qtwarn_onrelease
编译QtDesigner插件中使用CONFIG+=
desginerplugin
release
在这里使用“+=”,是因为我们添加我们的配置选项到任何一个已经存在中。
这样做比使用“=”那样替换已经指定的所有选项是更安全的。
A>
qt部分告诉qmake这个应用程序是使用Qt来连编的。
这也就是说qmake在连接和为编译添加所需的包含路径的时候会考虑到Qt库的。
B>
warn_on部分告诉qmake要把编译器设置为输出警告信息的。
C>
release部分告诉qmake应用程序必须被连编为一个发布的应用程序。
在开发过程中,程序员也可以使用debug来替换release
5.
指定目标文件名
TARGET=filename
如果不设置该项目,目标名会被自动设置为跟项目文件一样的名称
6.
添加界面文件(ui
)
INTERFACES=filename.ui
7.
平台相关性处理
我们在这里需要做的是根据qmake所运行的平台来使用相应的作用域来进行处理。
为Windows平台添加的依赖平台的文件的简单的作用域看起来就像这样:
win32{
SOURCES+=hello_win.cpp
}
所以如果qmake运行在Windows上的时候,它就会把hello_win.cpp添加到源文件列表中。
如果qmake运行在其它平台上的时候,它会很简单地把这部分忽略。
8.
如果一个文件不存在,停止qmake
如果某一个文件不存在的时候,你也许不想生成一个Makefile。
我们可以通过使用exists()函数来检查一个文件是否存在。
我们可以通过使用error()函数把正在运行的qmake停下来。
这和作用域的工作方式一样。
只要很简单地用这个函数来替换作用域条件。
对main.cpp文件的检查就像这样:
!
exists(main.cpp){
error("
Nomain.cppfilefound"
)
“!
”用来否定这个测试,比如,如果文件存在,exists(main.cpp)是真,如果文件不存在,!
exists(main.