Qt自定义窗口部件.docx_第1页
Qt自定义窗口部件.docx_第2页
Qt自定义窗口部件.docx_第3页
Qt自定义窗口部件.docx_第4页
Qt自定义窗口部件.docx_第5页
已阅读5页,还剩9页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

【原创】Qt自定义窗口部件QtDesigner自定义窗口部件有两种方法:改进法(promotion)和插件法(plugin)改进法1、改进法之前,要先写好子类化QSpinBox后的HexspinBox.h和HexspinBox.cpp文件。把这两个文件拷贝到想要的项目中。HexspinBox.hCpp代码1. #ifndefHEXSPINBOX_H2. #defineHEXSPINBOX_H3. #include4. classQRegExpValidator;5. classHexSpinBox:publicQSpinBox6. 7. Q_OBJECT8. 9. public:10. HexSpinBox(QWidget*parent=0);11. 12. protected:13. QValidator:Statevalidate(QString&text,int&pos)const;14. intvalueFromText(constQString&text)const;15. QStringtextFromValue(intvalue)const;16. 17. private:18. QRegExpValidator*validator;19. ;20. 21. #endifHexspinBox.cppCpp代码1. #include2. #includehexspinbox.h3. HexSpinBox:HexSpinBox(QWidget*parent)4. :QSpinBox(parent)5. 6. setRange(0,255);7. validator=newQRegExpValidator(QRegExp(0-9A-Fa-f1,8),this);8. 9. 10. QValidator:StateHexSpinBox:validate(QString&text,int&pos)const11. 12. returnvalidator-validate(text,pos);13. 14. 15. intHexSpinBox:valueFromText(constQString&text)const16. 17. boolok;18. returntext.toInt(&ok,16);19. 20. 21. QStringHexSpinBox:textFromValue(intvalue)const22. 23. returnQString:number(value,16).toUpper();24. 2、在需要开发的项目中的窗口中,1、用Qt Designer创建一个新的窗体main.ui,把控件箱里的QSpinBox添加到窗体中。2、右击微调框,选择“Promote to ”上下文菜单。3、在弹出的对话框中,类名处填写“HexSpinBox”,头文件填写“hexspinbox.h”好了。在ui生成的包含有QSpinBox的控件文件中,ui的源代码里面多了一段 HSpinBox QSpinBox hspinbox.h 包含文件变为hexspinbox.h。在Qt Designer中,QSpinBox表示的控件为HexSpinBox,并且可以设置所有的QSpinBox的属性。可以在VS2008中编译一下main.ui文件,从ui_main.h源代码中可以知道,引入的控件是:Cpp代码1. #include2. #include3. #include4. #includehspinbox.h5. 6. QT_BEGIN_NAMESPACE7. 8. classUi_QMainClass9. 10. public:11. QWidget*centralWidget;12. QPushButton*pushButton;13. QTableWidget*tableWidget;14. QSpinBox*spinBox;15. HSpinBox*hspinBox; 升级法的缺点是不能在Qt Designer中设置自定义控件自己的特有属性,也不能够绘制自己。这些问题可以用插件法解决。插件法1.VS中创建Qt4 Design Plugin 工程 ,名称叫custom自动建立如下几个文件:自定义控件:custom.h,custom.cpp插件:customplugin.h,customplugin.cpp源代码如下:custom.hCpp代码1. #ifndefCUSTOM_H2. #defineCUSTOM_H3. #include4. #includeui_test.h5. classcustom:publicQWidget6. 7. Q_OBJECT8. public:9. custom(QWidget*parent=0);10. custom();11. private:12. Ui:Formui;13. ;14. 15. #endif/CUSTOM_Hcustom.cppCpp代码1. #includecustom.h2. 3. custom:custom(QWidget*parent)4. :QWidget(parent)5. 6. ui.setupUi(this);7. 8. 9. custom:custom()10. 11. 12. customplugin.hCpp代码1. #ifndefCUSTOMPLUGIN_H2. #defineCUSTOMPLUGIN_H3. 4. #include5. 6. classcustomPlugin:publicQObject,publicQDesignerCustomWidgetInterface7. 8. Q_OBJECT9. Q_INTERFACES(QDesignerCustomWidgetInterface)10. 11. public:12. customPlugin(QObject*parent=0);13. 14. boolisContainer()const;15. boolisInitialized()const;16. QIconicon()const;17. QStringdomXml()const;18. QStringgroup()const;19. QStringincludeFile()const;20. QStringname()const;21. QStringtoolTip()const;22. QStringwhatsThis()const;23. QWidget*createWidget(QWidget*parent);24. voidinitialize(QDesignerFormEditorInterface*core);25. 26. private:27. boolinitialized;28. ;29. 30. #endif/CUSTOMPLUGIN_Hcustomplugin.cppCpp代码1. #includecustom.h2. #include3. #includecustomplugin.h4. customPlugin:customPlugin(QObject*parent)5. :QObject(parent)6. 7. initialized=false;8. 9. 10. voidcustomPlugin:initialize(QDesignerFormEditorInterface*/*core*/)11. 12. if(initialized)13. return;14. initialized=true;15. 16. 17. boolcustomPlugin:isInitialized()const18. 19. returninitialized;20. 21. 22. QWidget*customPlugin:createWidget(QWidget*parent)23. 24. returnnewcustom(parent);25. 26. 27. QStringcustomPlugin:name()const28. 29. returncustom;30. 31. 32. QStringcustomPlugin:group()const33. 34. returnMyPlugins;35. 36. 37. QIconcustomPlugin:icon()const38. 39. returnQIcon();40. 41. 42. QStringcustomPlugin:toolTip()const43. 44. returnQString();45. 46. 47. QStringcustomPlugin:whatsThis()const48. 49. returnQString();50. 51. 52. boolcustomPlugin:isContainer()const53. 54. returnfalse;55. 56. 57. QStringcustomPlugin:domXml()const58. 59. returnn60. n61. n62. 0n63. 0n64. 100n65. 100n66. n67. n68. n;69. 70. 71. QStringcustomPlugin:includeFile()const72. 73. returncustom.h;74. 75. 76. Q_EXPORT_PLUGIN2(custom,customPlugin)在其cpp的最后必须 添加下面的宏:1020304050607080901001101201301401501. Q_EXPORT_PLUGIN2(customWidgetPlugin,CustomWidgetPlugin)/第一个参数为插件的名字,第二个是插件类的名字(而不是自定义控件的类名)2. 新建后,直接编译,会产生如下错误1LINK : fatal error LNK1181: cannot open input file QtDesignerd.lib 这是因为此工程默认引用的是QtDesignerd.lib库,更改其为版本对应的库即可消除故障(VS2008是在项目的属性中Linker/input/Additional Dependencies中修改,我这里Debug配置使用的是QtDesignerd4.lib,Release版本使用QtDesigner4.lib)。3、使用自定义插件 1)、只需要把通过Release模式生成的项目.lib和项目.dll文件拷到C:Qt4.7.4pluginsdesigner中, 2)、 然后在QtDesigner中,选择菜单Help/About Plugin就可以看到你的自定义控件是否已经载入成功。在QtDesigner中控件列表中有一项My Widget 中就有你的自定义控件。参考:1、Qt自定义控件(插件)并添加到QtDesigher打开QtDesigner,我们自定义的空间custom成功使用界面如下:Qt自定义控件(插件)并添加到QtDesigher2010-01-19 08:567376人阅读评论(0)收藏举报qtmakefilewindows平台dll编译器之前使用Qt的时候都是手写代码的(因为批量按钮可以使用数组实现),但当界面越来越复杂时,这种开发效率就太低了;后来就开始使用QtDesigner,但要使QtDesigner支持我自己写的控件,需要提升或插件的形式(在中有介绍).结果看了之后,觉得提升的方式简单而不灵活,故使用插件法实现;步骤如下:具体可参照第三方开源组件Qwt部件库的插件类的实现方式,个人感觉特别规范1. 继承QObject和QDesignerCustomWidgetInterface实现插件类(或继承QObject和QDesignerCustomWidgetCollectionInterface实现多个自定义控件);2. 编写Qt平台无关的工程文件.pro(例如CustomWidgetP);3. qmakeCustomWidgetP;4. make(windows下vc平台使用nmake,如果发现缺少环境变量,可以运行其bin/vcvars32.bat配置环境)先说说第一点:继承后需要重写父类虚函数,原型如下:cppview plaincopy1. #include2. #include3. classCustomWidgetPlugin:publicQObject,publicQDesignerCustomWidgetInterface4. 5. Q_OBJECT/必须6. Q_INTERFACES(QDesignerCustomWidgetInterface)/必须7. public:8. CustomWidgetPlugin(QObject*parent=0);/构造函数,一般使其调用父类QObject的构造函数即可9. QStringname()const;/返回由该插件提供的窗口控件的名字10. QStringincludeFile()const;/返回由该插件封装的特定窗口控件的头文件的名称.这个头文件会包含在由uic生成的代码中11. QStringgroup()const;/返回自定义的窗口控件所属于的在QtDesigner里的组名,如果QtDesigner没有则会自动创建12. QIconicon()const;/自定义控件在QtDesigner的图标13. QStringtoolTip()const;/控件的提示14. QStringwhatsThis()const;/控件的这是什么15. boolisContainer()const;/控件是否包含其他控件,如果有则返回true,否则返回false16. QWidget*createWidget(QWidget*parent);/QtDesigner会调用这个函数创建自定义控件,返回创建的(C+中可能是new)自定义控件即可17. ;在其cpp的最后必须 添加下面的宏:cppview plaincopy1. Q_EXPORT_PLUGIN2(customWidgetPlugin,CustomWidgetPlugin)/第一个参数为插件的名字,第二个是插件类的名字(而不是自定义控件的类名)再说说第二点:.pro的参数和语法比较多, 在网上可以搜到不少资料, 在这里总结一下1.注释从“#”开始,到这一行结束。2.指定源文件SOURCES = *.cpp对于多源文件,可用空格分开,如:SOURCES = 1.cpp 2.cpp3.cpp或者每一个文件可以被列在一个分开的行里面,通过反斜线另起一行,就像这样:SOURCES = hello.cpp/(续行符 )main.cpp一个更冗长的方法是单独地列出每一个文件,就像这样: SOURCES+= hello.cpp SOURCES +=main.cpp这种方法中使用“+=”比“=”更安全,因为它只是向已有的列表中添加新的文件,而不是替换整个列表。3.指定头文件HEADERS = hello.h或者HEADERS += hello.h列出源文件的任何一个方法对头文件也都适用。4.配置信息CONFIG用来告诉qmake关于应用程序的配置信息。 CONFIG+= qt warn_on release编译QtDesigner插件中使用CONFIG +=desginer pluginrelease在这里使用“+=”,是因为我们添加我们的配置选项到任何一个已经存在中。这样做比使用“=”那样替换已经指定的所有选项是更安全的。Aqt部分告诉qmake这个应用程序是使用Qt来连编的。这也就是说qmake在连接和为编译添加所需的包含路径的时候会考虑到Qt库的。Bwarn_on部分告诉qmake要把编译器设置为输出警告信息的。Crelease部分告诉qmake应用程序必须被连编为一个发布的应用程序。在开发过程中,程序员也可以使用debug来替换release5.指定目标文件名TARGET = filename如果不设置该项目,目标名会被自动设置为跟项目文件一样的名称6.添加界面文件(ui)INTERFACES = filename.ui7.平台相关性处理我们在这里需要做的是根据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( No main.cpp file found)“!”用来否定这个测试,比如,如果文件存在,exists( main.cpp)是真,如果文件不存在,!exists( main.cpp )是真。9.检查多于一个的条件假设你使用Windows并且当你在命令行运行你的应用程序

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论