QT做skin需要注意的因素
Qt控件背景图片设置总结

Qt控件背景图⽚设置总结⾃⼰开发了⼀个股票智能分析软件,功能很强⼤,需要的点击下⾯的链接获取:扫码关注公众号1.Qss 的setStyleSheet设置背景图⽚1.1background-image设置平铺或者居中 这种⽅法设置的要点是要将图⽚添加到qrc⽂件中,形成资源路径,然后在QT界⾯编辑或者程序代码中通过设置路径来实现背景图⽚设置。
图⽚⼤⼩不能⾃适应控件⼤⼩。
只能可以实现平铺或者居中显⽰。
background-position:center;设置显⽰位置,background-repeat:no-repeat;设置是否平铺;(1)平铺重复显⽰QWidget#widgetWinPic{ background-image:url(:/FaceMatch/Resources/pic/viewbackin.png); background-repeat:repeat;}或者代码中ui.widgetWinPic.setStyleSheet("QPushButton{ background-image:url(:/FaceMatch/Resources/pic/viewbackin.png);background-repeat:repeat;");(2)居中不重复设置QWidget#widgetWinPic{ background-image:url(:/FaceMatch/Resources/pic/viewbackin.png); background-position:center; background-repeat:no-repeat;}或者代码中 ui.widgetWinPic.setStyleSheet("QPushButton{ background-image:url(:/FaceMatch/Resources/pic/viewbackin.png);background-position:center;background-repeat:no-repeat;");1.2 border-image设置按照控件⼤⼩缩放填充整个控件图⽚被拉伸填满整个控件,可以实现缩放拉伸填充。
QTP简介及常见问题

◆Resources
添加一些之前设置的公共函数,如:调用录制键盘操作函数。
◆Parameters
增加,修改,删除 参数
◆environment
环境变量设置(内部,外部)
◆Web
Browser navigation timeout[ ]: 设置运行测试步骤之前 等待网页加载时间的最大值
◆java
2 .Tools-> Web Event Recording Configuration
点击 Custom Settings按钮,弹出设置webObject Event页, 如下图:
(a) 设置WebElement的事件 选中左侧窗口的WebElement,点击event -> add > onmouseover 。并确定在Listen栏内状态是If Handler 。 record栏内,状态是enabled。 再点击event -> add -> onmouseoout 。并确定在 Listen栏内状态是If Handler 。 record栏内,状态是 enabled。 再点击event -> add -> onClick 。并确定在Listen 栏内状态是Always 。 record栏内,状态是enabled。 如下图:
第二步:开始录制测试脚本 点选【Automation】→【Record】或是点选工具列上的 【Record】按钮。 第三步:开始录制 例如:录入一条部门信息 双击“工资管理→基础设置→部门”弹出编辑界面, 单击【新增】录入代码:gl, 节点类型:汇总节点, 名称:管理部门, 单击【保存】ok. 第四步:停止录制 在QuickTest,点选工具列上的【Stop】按钮,停止录制, 此时即完成以“博科myerp9.6 普及版”为 范例录制的“部门” 的【新增】与【保存】。
SkinMagic使用详解

菜单栏自定义加皮肤的方法
皮肤文件中定义菜单栏的背景 皮肤文件中定义popupmenu的皮肤 皮肤文件中定义popupmenu的皮肤 调用SetWindowSkin给窗体加皮肤 调用SetWindowSkin给窗体加皮肤
给菜单加载图片
int __stdcall SetWindowMainMenuImage( HWND hWnd , MENUIMAGEINFO* pMenuImage, UINT nCount , HIMAGELIST hImageList , HIMAGELIST hHotImageList, HIMAGELIST hDisabledImagelist );
给快捷菜单添加图片
BOOL __stdcall TrackSkinPopupMenuEx( HMENU hMenu, LPCTSTR lpSkinName, UINT uFlags, int x, int y, HWND hWnd , MENUIMAGEINFO* pMenuImage, UINT nCount , HIMAGELIST hImageList , HIMAGELIST hHotImageList, HIMAGELIST hDisabledImagelist );
例:VERIFY( 例:VERIFY( 1 == SetSingleDialogSkin(this->GetSafeHwnd(), SetSingleDialogSkin(this_T("Dialog") ) ); m_list.SubclassDlgItem(IDC_LIST1,this);
QT问题集锦_从学习Qt遇到的各种问题

第一篇初级问题1 用Qt4.8.5打不开冯工柏菲软件问题描述:运行环境为Qt4.8.5 + QtCreator3.0.0+VS2010专业版+ Debuging Tools for Windows(x86),用Creator无法打开项目文件,截图如下:弹出错误:Cannot read E:/PROJECT/Zhou-0410/testToolbar.pro: Unexpected UTF-8 BOM原因分析:未知解决方法:1 安装VS2010SP1,未解决2 安装VS-Add,未解决3 使用Creator2.6解决2 编译失败,系统找不到指定路径问题描述:见下图原因分析:1)可能:添加VS编译器环境变量,在PATH中添加VS 中NMAKE路径2)确定:Creator或编译器无法识别&符号,即路径原文件名为R&T中含有非法字符,无法准确识别路径3)默认的环境变量已经有了NMAKE路径解决方法:把路径中非法字符删除即可3 编译出现乱码,Parse Error原因分析:未知,应该是非法字符导致。
4 无法解析的外部符号原因分析:声明的函数,未实现,或在未实现它的情况下调用了它解决方法:实现后再调用5 中文乱码问题描述:见图解决方法:转换成utf8格式6 控件背景图片添加问题描述:按照相对路径添加背景图片不显示解决方法:1)相对路径起始点为构建目录,如图2)添加资源文件,把背景图片放到资源文件中,再通过控件属性,指定资源文件中的背景图片即可。
7 昨天能启动运行成功,今天说异常结束,运行不了原因分析:可能是昨天在windows、system32里面添加了qtcore.dll等文件导致解决方法:删除之后就可以运行了,但具体删除哪个,待定8 通过控件,查找操作函数?9 修改控件名称时,弹出外部链接错误解决方法:修改名称后,通常有以下步骤1)在头文件中删除对应槽;2)修改槽动作名称或重新生成槽动作,把之前代码拷贝到新槽动作中。
多年来开发QT累计的笔记

QT学习笔记-1.QT主要的对象说来惭愧学习c++很长时间了一直没有使用c++开发过软件界面所以现在想认认真真的学习一个c++图形界面框架库本来想学习Xwidget但是这个资料不大好找有啥问题不好解决那就学习QT吧不说QT的优缺点,不说如何编译QT从QT的主要库类开始吧知道了基本的对象之后如果需要学习看看文档就知道了如果需要编译QT的话再下个代码试着编译吧QApplication 应用程序类管理图形用户界面应用程序的控制流和主要设置QLabel 标签类提供文本或者图像的显示QPushButton 按钮类提供了命令按钮按钮的一种QButtonGroup 按钮组合类按钮组相关按钮的组合QGroupBox 群组类一个有标题的组合框QDateTimeEdit 日期时间编辑框类QLineEdit 行编辑框类单行文本编辑器QTextEdit 文本编辑框类单页面多信息编辑器对象QComboBox 组合框类QProgressBar 进度条类QLCDNumber 数字显示框类QScrollBar 滚动条类QSpinBox 微调框类QSlider 滑动条类QIconView 图标视图类QListView 列表视图类QListBox 列表框类QTable 表格类QValidator 有效性检查类QImage 图像类QMainWindow 主窗口类QPopupMenu 弹出性菜单类QMenuBar 菜单栏类QToolButton 工具按钮类QToolTip 提示类QWhatsThis 这是什么类QAction 动作类QHBoxLayout 水平布局类QVBoxLayout 垂直布局类QGridLayout 表格布局类QT对话框类QMessageBox 消息对话框类QProgressDialog 进度条对话框类QWizard 向导对话框类QFileDialog 文件对话框类QColorDialog 颜色对话框类QFontDialog 字体对话框类QPrintDialog 打印对话框类基本就这些对象了要系统学习QT 还需要看看QT的slot系统,QT库类接口等具体的学习就是看例子咯QT学习笔记-2.QT窗体布局和皮肤加载学习QT的一个原因是貌似QT做出来的界面比较绚丽我倒想看看能做出来啥样子的从QT窗体布局说起凡是窗体布局无非就是如何摆放的问题1.想当然如果摆放有2个方式一个是所见即所得,一个是使用布局管理器先说后者吧2.QT有好几种布局管理器无非就是啥子流式布局,格子布局等等从这个层级上说软件界面都是布局嵌套的3.布局和控件的关系一般是一个布局对应于一个控件容器(或者顶层控件)使用当前布局管理器加挂子控件(容器)即可然后给当前控件挂上布局管理器即可下面是一个简单的QT Layout的例子(从QT例子改的)1.class Dialog : public QDialog2.{3. Q_OBJECT4.public:5. Dialog();6.private:7. void createHorizontalGroupBox();8.9. enum {button_number = 4};10. QGroupBox *groupbox;11. QPushButton *buttons[button_number];12. QDialogButtonBox *buttonBox;13.};复制代码实现如下:1.#include <QtGui>2.3.#include "dialog.h"4.5.//! [0]6.Dialog::Dialog()7.{8. createHorizontalGroupBox();9.10. buttonBox = new QDialogButtonBox(QDialogButtonBox::Ok11. | QDialogButtonBox::Cancel);12.13. connect(buttonBox, SIGNAL(accepted()), this, SLOT(accept()));14. connect(buttonBox, SIGNAL(rejected()), this, SLOT(reject()));15.16. QVBoxLayout *mainLayout = new QVBoxLayout;17. mainLayout->addWidget(groupbox);18. mainLayout->addWidget(buttonBox);19. setLayout(mainLayout);20.21. setWindowTitle(tr("LayoutTest"));22.}23.24.void Dialog::createHorizontalGroupBox()25.{26. groupbox = new QGroupBox(tr("Layout Test"));27. QHBoxLayout *layout = new QHBoxLayout;28.29. buttons[0] = new QPushButton(tr("Button1"));30. buttons[1] = new QPushButton(tr("Button2"));31. buttons[2] = new QPushButton(tr("Button3"));32. buttons[3] = new QPushButton(tr("Button4"));33.34. for(int i = 0;i<button_number;i++)35. layout->addWidget(buttons[i]);36. groupbox->setLayout(layout);37.}复制代码几个知识点:1.groupbox = new QGroupBox(tr("Layout Test"));Layout Test 是个文本这个无须解释那tr呢?查查资料知道是为了支持多语言先知道即可以后使用的话在具体查查吧2.QDialogButtonBox是个什么东西看看最终的程序界面吧原来是对话框的确认和取消按钮再看信号槽函数无非就是绑定按钮到操作函数connect(buttonBox, SIGNAL(accepted()), this, SLOT(accept()));connect(buttonBox, SIGNAL(rejected()), this, SLOT(reject()));那accepted和accept函数有啥区别?看看文档accept函数的解释是:Hides the modal dialog and sets the result code to Accepted accpeted函数的解释是:This signal is emitted when the dialog has been accepted either在说说QT皮肤学习QT的主要目的就是想做做脸蛋好看好的软件界面那就试试看吧查到的QT有一个名叫QSS(CSS?)的文件可以原来换肤那就改改看吧#include <QApplication>#include <QFile>#include <QStyleFactory>#include <QTextStream>#include "dialog.h"void setSkin(QApplication* const app, QString const &skinFile);int main(int argc, char *argv[]){QApplication app(argc, argv);setSkin(&app ,"skin.qss");Dialog dialog;dialog.show();return app.exec();}void setSkin(QApplication* const app, QString const &skinFile){QFile qss(skinFile);qss.open(QFile::ReadOnly);app->setStyleSheet(qss.readAll());qss.close();}相应的QSS文件如下:QPushButton{color:red;background:url(setting.png)}这里把PushButton的文本颜色设置为红色同时把它的背景设置为图片stting.pngQT学习笔记-3.Codecs例子学习QT自带的例子Codecs是一篇关于保存和载入不同编码文本的例子其界面比较简单一个简单的单文档而已有2个主要的对象一个是MainWindow用于窗体主界面另外一个是PreviewForm用于显示编码格式列表1.其编码格式的获取部分代码如下:QMap<QString, QTextCodec *> codecMap;QRegExp iso8859RegExp("ISO[- ]8859-([0-9]+).*");foreach (int mib, QTextCodec::availableMibs()) {QTextCodec *codec = QTextCodec::codecForMib(mib);QString sortKey = codec->name().toUpper();int rank;if (sortKey.startsWith("UTF-8")) {rank = 1;} else if (sortKey.startsWith("UTF-16")) {rank = 2;} else if (iso8859RegExp.exactMatch(sortKey)) {if (iso8859RegExp.cap(1).size() == 1)rank = 3;elserank = 4;} else {rank = 5;}sortKey.prepend(QChar('0' + rank));codecMap.insert(sortKey, codec);}codecs = codecMap.values();通过使用foreach循环来获取支持的编码格式并保存不过看上去foreach (int mib, QTextCodec::availableMibs())有点奇怪查查资料解释是foreach(variables ,container)关键字是Qt对c++的一个扩展,主要用于按顺序历经容器(container)中的对象2关于文件菜单的生成和设置菜单的构造一个例子saveAsMenu = new QMenu(tr("&Save As"), this);这里有2个参数一个是菜单显示文另外一个是当前窗体指针然后就可以加载子菜单,设置分隔符,设置事件响应等操作了例子为:fileMenu = new QMenu(tr("&File"), this);fileMenu->addAction(openAct);fileMenu->addMenu(saveAsMenu);fileMenu->addSeparator();fileMenu->addAction(exitAct);那如何绑定菜单到当前窗体呢如下:menuBar()->addMenu(fileMenu);menuBar()->addSeparator();menuBar()->addMenu(helpMenu);menuBar()是QmainWindow的成员函数用于获取窗体菜单项指针3.QT对象QActionQT文档对QAction的解释是可以抽象用户接口对象-可以插入控件例子如下:openAct = new QAction(tr("&Open"), this);openAct->setShortcuts(QKeySequence::Open);connect(openAct, SIGNAL(triggered()), this, SLOT(open()));无非就是对象声明,设置快捷键,链接函数和响应而已4.窗体设置setWindowTitle(tr("Codecs"));resize(500, 400);5.消息对话框QMessageBox::about(this, tr("About Codecs"),tr("The <b>Codecs</b> example demonstrates how to read and write " "files using various encodings."));QT学习笔记-4.信号与插槽本文主要是对C++ GUI Programming with Qt4一书 Signals and Slots in Depth 部分的翻译信号与插槽机制是Qt编程的基础.它可以绑定对象而不需要对象之间彼此了解。
[MTK]“皮肤”使用说明
![[MTK]“皮肤”使用说明](https://img.taocdn.com/s3/m/f649852c915f804d2b16c195.png)
“皮肤”使用说明一、简介:Skin(皮肤)控件,为大家提供了一种图形界面更为灵活,交互操作更为方便,效率也更高的机制。
它实质上相当于一个容器,用户可以在其中加入多种自己所需要的控件,并且可以方便的设置控件以及整个皮肤的外观表现。
目前Skin中支持的控件有Button,CheckButton,Lable,ImageLable,Slider,RotationSlider,MScontrol。
Button:普通的按钮控件,可以有点击,抬起,无效,高亮四种状态,用户需要为其提供相应的图片。
CheckButton:相当于CheckBox的控件,有Check,点击,高亮,无效四种状态,用户需要为其提供相应的图片。
Lable:显示文字的控件,用户设置文字的内容,以及文字的字体和颜色。
ImageLable:一种灵活的显示文字的控件,用户自己建立文字表,并提供每个字符的图片与其对应。
然后设置文字内容,最终显示出多种形式的文字效果。
Slider:普通的滑竿控件。
Rotation:圆形的滑竿控件。
MScontrol:外界的窗口控件,通过这个接口,用户可以在Skin中使用外界所提供的各种控件。
二、数据结构:1.skin_head_t是Skin的数据结构(如下所示),其中提供了整个Skin所需要的所有数据。
包括名称,Skin中的控件数组,Skin所使用的图片数组,字体数组,Skin的回调函数,消息处理函数等等。
/** Skin header information structure */struct skin_head_s{/** The name of the skin. */char* name;/*** The style of the skin, can be OR'ed by the following values:* - SKIN_STYLE_TOOLTIP* The skin has tooltip window.*/DWORD style;/** The pointer to the array of the bitmaps used by the skin. */const HBITMAP* bmps;/** The pointer to the array of the logical fonts used by the skin. */ const HFONT* fonts;/** The index of the background bitmap in the bitmap array. */int bk_bmp_index;/** The number of the items in this skin. */int nr_items;/** The pointer to the array of skin items. */skin_item_t* items;/** The attached private data with the skin by application. */DWORD attached;/******** start of internal fields ********//* The event callback function of the skin. */skin_event_cb_t event_cb;/* The window message procedure of the skin window. */skin_msg_cb_t msg_cb;/**** The fields initialized when skin_init called. ****//* The rectangle heap for hit-test regions. */// BLOCKHEAP rc_heap;/**** The fields initialized when create_skin_main_window or create_skin_control called. ****//* The handle of window in which the skin locates. */HWND hwnd;/* The handle of tool tip window. */HWND tool_tip;/* The old x and y. */int oldx, oldy;/* The current hilighted item. */skin_item_t* hilighted;/* cached identifier. */int cached_id;/* the item whose identifier is cached_id. */skin_item_t* cached_item;};2.skin_item_t是Skin中每项控件的数据结构(如下所示),其中记录了每个控件的特性,重要的有控件的id,控件左上角的坐标,控件点击区域的位置大小,控件所示用的图片id,控件的属性,以及typeData属性,该属性一般记录了控件各自的特性的属性。
CorePlex开发手记:一、Winform窗体皮肤及简单换肤机制

CorePlex开发手记:一、Winform窗体皮肤及简单换肤机制CorePlex开发手记:一、Winform窗体皮肤及简单换肤机制前言: CorePlex代码库作为一个Visual Studio插件, 允许用户通过VS直接访问在线代码库。
开发过程中我翻阅了很多网上的资料,也总结了一些技术要点,现写成系列文章,以飨读者。
同时,里面某些技术也是我第一次使用,如有不对的地方,还请行家狠拍,欢迎大家指正~闲话休絮,进入正题。
从本篇文章开始,介绍 CorePlex 的窗体皮肤机制,以及简单的换肤功能。
我们先来看看效果:换一个皮肤看看:需要实现的是圆角窗体+四周的阴影,要实现这个,大致的思路是这样的:先使用 Graphics 绘制一个 Bitmap,将需要的皮肤绘制成一个内存图,然后使用 Win32的API:UpdateLayeredWindow 将这个构造好的 Bitmap 绘制/更新到窗体上。
我们来看看具体的实现吧。
第一部分,构造皮肤背景。
为了实现圆角以及四周的阴影,我将窗体背景划分成了九宫格的形式:主要思路是:除5 之外的其他部分,都作为窗体的边框和圆角来处理。
而5这个部分,则作为圆角窗体的主体背景部分。
1、3、7、9四个部分,作为圆角,我使用PathGradientBrush 来绘制扇形渐变,而2、4、6、8四个部分,作为边框,我使用LinearGradientBrush 来绘制线性渐变。
不多说,见代码:/// <summary>/// 绘制四角的阴影/// </summary>/// <param name="g"></param>/// <param name="corSize">圆角区域正方形的大小</param> /// <returns></returns>private void DrawCorners(Graphics g, Size corSize){/** 四个角,每个角都是一个扇面* 画图时扇面由外弧、内弧以及两段的连接线构成图形* 然后在内弧中间附近向外做渐变** 阴影分为9宫格,5为内部背景图部分* 1 2 3* 4 5 6* 7 8 9*/Action<int> DrawCorenerN = (n) =>{using (GraphicsPath gp = new GraphicsPath()){// 扇面外沿、内沿曲线的尺寸Size sizeOutSide = new Size(corSize.Width * 2, corSize.Height * 2);Size sizeInSide = new Size(this.SkinOptions.CornerRadius * 2, this.SkinOptions.CornerRadius * 2);// 扇面外沿、内沿曲线的位置Point locationOutSide, locationInSide;// 当圆角半径小于MinCornerRadius时,内沿不绘制曲线,而以线段绘制近似值。
Qt的皮肤设计

Qt的皮肤设计Qt的皮肤设计(Style Sheet)Qt的皮肤设计,也可以说是对Qt应用程序的界面美化,Qt使用了一种类CSS的样式规则QSS。
一、Style Sheet的应用 1.直接在程序代码中设置样式,利用setStyleSheet()方法widget->setStyleSheet("color:red"); //widget内字体颜色为红色widget->->setStyleSheet(QPushButton{color:red}QPushButton:hove{color:yellow}); //widget内的QPushButton对象字体颜色为红色,当鼠标悬浮时为黄色 2.使用qss文件步骤:创建qss文档,例:stylesheet.qss根据qss语法,写自定义的内容(详见qss语法)引入qss文件,使界面效果生效QFile file("skin/clean.qss");//路径为应用程序所在目录开始file.open(QFile::ReadOnly);QTextStream filetext(&file);QString stylesheet= filetext.readAll();this->setStyleSheet(stylesheet);二、qss语法qss和css一样有两部分组成,选择器和语句声明(selector和declaration)选择器分为一般选择器、子控件选择器(辅助控制器)和伪选择器(伪状态)(下面为转载,出处/davesla/archive/2011/01/30/1947928.html)1、一般选择器(selector)Qt支持所有的CSS2定义的选择器,其祥细内容可以在w3c的网站上查找/TR/CSS2/selector.html ,其中比较常用的selector类型有:通用类型选择器:* 会对所有控件有效果。
Qt制作Skin

使用Skin(皮肤)是制作酷酷界面的一个有利的工具,在用户界面GUI越来越重要的今天,一个应用程序如果只有一套皮肤,不能更换皮肤,那么这个应用程序的生命力是非常值得人们怀疑的;那么使用Qt如何制作酷酷而又吸引人的界面呢?下面我会对在Qt下进行皮肤制作,异型窗口制作做一个总结,对于新手是一个入门,对于老手算是一个参考吧,如果有不妥和不当之处,还请大家不吝指出。
制作漂亮的界面目前至少有两个关键因素,一个是窗口需要提供异型显示,另外一个就是提供换肤功能。
前者是彰显当前年轻人个性的一个很好的方式,因而也是深受当今年轻人的热爱;后者则是在前者的基础之上给了年轻人对于自己喜好的软件样式的更广泛的选择。
一、异型窗口1、定义:异型窗口主要对应的是操作系统默认的窗口样式。
它是相对于默认操作系统中规规矩矩的长方形窗口而产生的一种可以采用任何形状显示的GUI界面窗口。
2、简介:任何一种操作系统,无论是MAC,Linux,还是Windows,在其GUI系统中都会提供一种默认的窗口样式。
一般情况下这种样式都是比较规矩的长方形,或者圆角长方形;这种显示样式是由操作系统提供的,如果你采用其上的IDE进行GUI界面开发,默认的界面样式仍然是系统默认的;然而,幸运的是,大部分的成熟的GUI开发系统都会提供异型窗口开发的解决方案。
3、实现说明:第一步、窗口类需要从QWidget继承,象这样:class LExample:public QWidget{Q_OBJECT // QT的宏,如果使用QT的信号和槽,必须在类的声明中的第一行加入此宏;具体情况参考QT文档;LExample(QWidget *pv_event);}; /* class LExample */注意:必须是公有继承,否则你这个窗口很多功能都实现不了。
第二步、窗口初始化时需要更改窗口为自定义模式和没有边界模式, like this:LExample::LExample:QWidget(pv_event, NULL, WStyle_Customize | WStyle_NoBorder){//}注意:这两者不可缺一,否则会出现其他效果,并不是完全的异型界面了,读者可自行尝试;第三步、如果整个程序主界面是异型,那么在主窗口初始化的时候增加下面这句话:setBackgroundMode(QWidget::NoBackground);注意:这一条语句并不是必要的,去掉也并不影响最终结果;第四步、制作主界面异型图片和檬板图片;有些人一看到檬板俩字就像到了复杂的图像处理,已经有了要闪人的意思了,其实檬板的原理或许有点复杂,但是这里的做法却非常简单,我们只需要完成两副图片即可;* 第一副,是你准备显示的主界面图片,这个图片的形状,内容设计你自己可以随意定制;* 第二副,这是一张檬板图片,这个檬板图片是什么样子的?它是做什么用的?这个檬板图片是一个黑白单色图片,也就是说这个图片只有黑白两色。
QT做skin需要注意的因素

2.窗口的移动
由于上述窗口不受窗口管理器的管理的特性,所以移动窗口需要特殊处理,一般的方法是截取根Widget的鼠标按钮事件,自己处理鼠标点击和移动的事件。
void SkinDem:mouseMoveEvent(QMouseEvent *e){QPoint newpos = e->globalPos();QPoint upleft = pos0 + newpos - last;move(upleft);}void SkinDem:mousePressEvent(QMouseEvent *e){last = e->globalPos();pos0 = e->globalPos() - e->pos();}
制作表皮有几个重要的因素值得考虑:
1.使用无边界的窗口
在XWindow下,无边界的窗口是指不受窗口管理器管理的边界不规则的窗口。由于不受窗口管理器管理管理,所以软件窗口界面没有附加的标题条(Title Bar)等。在Qt中,建立无边界窗口的最简单的方法是设置QWidget的WFlags的值是WStyle_NoBorder。它定义在qnamespace.h中。不规则窗口的特点则要求对整个窗口使用图像掩码。使用X窗口形状的扩展(X Shape Extension)来达到要求。在Qt中可以直接使用,
这里我们取得的鼠标位置是绝对位置,即相对于根窗口的位置,同时也记录下窗口左上角的位置,当鼠标移动时,取得新的绝对位置,则窗口左上角的新位置应该是原来位置与鼠标移动的位置之差。
3.按钮的制作
QT常见问题

校验和d检验和(checksum),在数据处理和数据通信领域中,用于校验目的地一组数据项的和。
它通常是以十六进制为数制表示的形式。
如果校验和的数值超过十六进制的FF,也就是255. 就要求其补码作为校验和。
通常用来在通信中,尤其是远距离通信中保证数据的完整性和准确性。
这些数据项可以是数字或在计算检验的过程中看作数字的其它字符串。
校验和(checksum)是指传输位数的累加,当传输结束时,接收者可以根据这个数值判断是否接到了所有的数据。
如果数值匹配,那么说明传送已经完成。
TCP和UDP传输层都提供了一个校验和与验证总数是否匹配的服务功能。
#include<QtSerialPort/QSerialPort> 窜口头文件#include<QtCore/QtGlobal> 核心头文件#include<QtSerialPort/QSerialPort> 窜口头文件#include<QWaitCondition> 等待头文件里面包含wake()函数//**************#include<QProgressBar>进度条类#include<QLCDNumber>数字显示框类#include<QScrollBar>滚动条类#include<QSpinBox>微调框类#include<QSlider>滑动条类#include<QIconView>图标视图类#include<QListView>列表视图类#include<QListBox>列表框类#include<QTable>表格类#include<QValidator>有效性检查类#include<QImage>图像类#include<QMainWindow>主窗口类#include<QPopupMenu>弹出性菜单类#include<QMenuBar>菜单栏类#include<QToolButton>工具按钮类#include<QToolTip>提示类#include<QWhatsThis>这是什么类#include<QAction>动作类#include<QHBoxLayout>水平布局类#include<QVBoxLayout>垂直布局类#include<QGridLayout>网格布局类QT对话框类#include<QMessageBox>消息对话框类#include<QProgressDialog>进度条对话框#include<QWizard>向导对话框类#include<QFileDialog>文件对话框#include<QColorDialog>颜色对话框#include<QFontDialog>字体对话框#include<QPrintDialog>打印对话框//***************class groupbox 显示虚线分割线QwtPlot是用来绘制二维图像的widget,在它的画板上可以无限制的显示绘画组件。
QT开发注意点

1、,用托管C++把逻辑层封装下就行了,我们单位就是这样实现的,界面用WPF写,底层实现用C++,中间用托管C++过度WPF C++”2、MFC中调用WPF教程3、估计即会WPF,又会QT的人不多4、C++开发WPF,Step by Step/sun9411323/archive/2007/12/04/981600.html5、WPF下一代前端应用的标准?会不会是它?6、wpf出了微软平台就是废的,QT跨平台,界面做出来你可以比较一下,看看效果就知道什么叫微软盲从党,有前途的语言才是好的语言。
QT确实和wpf不是一个等级,因为高出太多了,精彩太多了,只有真正用过两者开发的人才会深有感触。
7、wpf好个P,和QT没法比,QT有很多脚本支持,python,lua都可以调用8、深圳艾德华:QT样式;QT很多扩展库和第三方的控件库;9、QT界面库的效率还是比WPF、.Net、Java高几个数量级的,因为毕竟QT开发出来的是机器码,不是虚拟机或解释程序可以比拟的。
10、使用静态链接好,还是使用动态链接好11、QT它只是一个库(应用程序框架)而己12、QT对象模型:可查询和可设计的对象属性强大的事件和事件过滤器间间隔驱动的计时器使得在一个事件驱动的图形界面中优美的整合多个任务分层的和可查询的对象树壁免野指针(自动调制为0)穿越库边界的动态计算13、元对象系统是一个C++扩展,它使得这个语言更适合真正的组件GUI编程14、为何Qt不使用模板来实现信号和槽?15、QT中的对象考贝:创建了新的身份16、Qt对象应该被当作身份,而不是值身份可以被克隆,但是不能被拷贝或者指定大小,而且克隆一个身份是一个比拷贝或者指定一个值要复杂的多的操作。
因此,QObject和所有QObject的子类(直接或间接的)使得它们的拷贝构造函数和分配操作无效???17、MFC和QT是C++中常见的GUI框架,而WinForm和WPF是C#中常用的框架,不过我们一般很少叫WinForm框架,可能直接叫图形控件类库更多点.反正只是个称呼罢了,爱咋叫就咋叫.另外WinForm与WPF(即Windows Form与Windows Presentation Foundation,用于windows的上的桌面应用开发)都只是提供了一堆GUI类库,而MFC与QT除了一堆GUI类库外还提供了其他很多类.功能更强大.18、站在开发者的角度(站其他角度可能不一样)一个软件无非就是保存数据,处理数据,数据间一些逻辑操作,然后通过一个好友的UI界面与用户交互19、各种设计模式是满天飞,五花八门,但知名度最高的是MVC模式(model , view,controller).就很好的体现了这一点,model + controller是数据处理那一块,而view就是UI界面.实际上QT,MFC,WinForm,WPF都相当于简化的MVC模式,由三层变成两层.model +controller没做区分,弄成一层了.而view这一层则是单独弄出来,UI与与数据的逻辑处理代码的分离使得条理清晰,便于理解与维护.而且更重要的是很多UI控件都是做好了的,你直接拖来用不行.另外你可能可能听说过STL(standard template library),标准模板库相当于把数据结构及对数据的操作(算法)这些常用的东东都做好给你调用,相当于把数据结构和算法那些思想实现成通用的代码供你调用.C++中的MFC和C#中的WinForm有点类似,而C++中的QT与C#中的WPF又有点类似20、QT与WPFQT与WPF同为C++的GUI框架,QT与MFC不那么相似,那种逻辑反而更接近C#的wpf框架一点.首先不是所有UI相关代码都像MFC一样整到一个rc文件,而是一个UI页面有对应一个后缀为ui的的xml文件.而数据逻辑处理代码是放h,cpp文件中.而且这三个谁的名字都相同. 而如果要与控件交互也跟wpf一样方便,每个控件有个objectName,相当于MFC的资源ID号,然后调用控件时直接用这个名字就行,当然前面要加个指向自身所在类的指针.比如有类Arwen,有button名为btn,则一般是先Arwen* ui; 然后ui->btn就行.实际上跟wpf中用this.btn一样,只不过wpf中this前缀是可以省略的. 另外QT里面也没有MFC中的消息处理概念,而是封装成一个叫signal / slot的机制.这跟C#中的WinForm事件(event)非常类似,例如你右击QT中的一个按钮,然后右击go to slot选择一种signal,就相当于C#里面的各种类型的事件,当然signal的各类要少点.然后slot就是事件对应的处理函数.WPF也是一个UI页面对应一个文件,后缀为xaml的文件,xaml全称是eXtensible Application Markup Language我们可以把它看成一种特殊的xml文件.而QT里面的ui文件就是标准的xml文件了啊.然后其他UI无关的代码就放xaml.cs文件中.应该说从符合我们思维习惯的角度来说WinForm是最容易理解的,UI页面对应的代码完全是标准C#代码. 而MFC页面对应的rc文件,QT页面对应的xml文件,WPF页面对应的xaml文件都不是标准的C++或C#代码.不太符合我们的思维习惯.所谓大道归一,其实很多的方法,虽然初期不同,但发展到一定程度后,往往又会出现惊人的相似之处。
qt之窗口换肤

qt之窗⼝换肤1、相关⽂章2、概要毕业两年了,⼀直使⽤的是qt界⾯库来开发程序,使⽤过vs08、10、13等开发⼯具,并安装了qt的插件,最近在做客户端换肤功能,所以就对qt的qrc做了点⼉研究,我是⼀个实⼲派(可能有点⼉虚),相对于看⽂档来说。
本⽂开头我就给出了两篇博客,这两篇博客对我理解qrc这个东西有很⼤的帮助,接下来我就简单分析下我的理解。
⾸先说明下qrc是qt的东西,⽽不属于vs,这也很容易证明,那就是vs的⼯程师不识别qrc⽂件的,如果需要使⽤qrc⽂件,那么是需要我们⼿动新建⼀个txt,然后改后缀并添加到vs⼯程⾥。
添加到vs⼯程⾥的qrc⽂件如果我们要打开它,可以qt⾃带的qt resource editor,如图1所⽰。
⽽我们使⽤qrc也有多种⽅式,本⽂中会提及到两种⽅式(不知道还有第三种没),⼀种是把qrc⽂件使⽤rcc编译成qrc_xxx.cpp⽂件,这个⽂件以静态的C++压缩⼆进制数组包含了所有图⽚和其他资源的数据;另⼀种是把qrc⽂件⽤rcc编译成rcc⼆进制⽂件(rcc -binary r.qrc -or.rcc).图13、换肤理解铺垫了qrc的东西后,我先说说我对换肤的理解,可能有失偏颇,但总归是个⼈见解,⼤⽜勿喷。
qt程序换肤,个⼈理解可以从这两点来修改:rgb+png,咋⼀看似乎不能理解,其实也挺好理解,接下来我就说下我⾃⼰的换肤过程rgb替换所谓rgb替换就是单纯的颜⾊替换,这个也可能是我们⼤多数⼈都会使⽤的⼀种换肤。
其实原理很简单,就是把所有的stylesheet描述都拿出来,然后放到⼀个qss⽂本⽂件中,把这个⽂件添加到qrc⽂件中,qrc中的内容最终会被编译成⼆进制数据供我们程序使⽤,编译的⽅式就是前⽂中提及到的两种⽅式。
加载qss⽂件并使⽤到全局代码如下:1 QFile file(filename);2if (!file.open(QFile::ReadOnly))3 {4return;5 }67 QTextStream in(&file);89in.setCodec("UTF-8");10 QString qss = in.readAll();1112 qApp->setStyleSheet(qss);View Code上边这个⽅法的参数就是qss⽂件在qrc中的资源路径,可以使⽤该⽅法随时进⾏rgb换肤。
QT自定义精美换肤界面

QT⾃定义精美换肤界⾯核⼼处理部分:1:⽆边框窗体处理对标题栏安装eventFilter事件监听器监听⿏标双击事件,重载mouseMoveEvent、mousePressEvent、mouseReleaseEvent三个事件实现⿏标拖动,当窗体改变⼤⼩后还必须⽤QRect location;来记住当前窗体位置,⽅便按下右上⾓还原按钮时将窗体设置在最⼤化前的位置。
部分代码如下:1 bool frmMain::eventFilter(QObject *obj, QEvent *event)2 {3 if (event->type() == QEvent::MouseButtonDblClick) {4 this->on_btnMenu_Max_clicked();5 return true;6 }7 return QObject::eventFilter(obj, event);8 }910 void frmMain::mouseMoveEvent(QMouseEvent *e)11 {12 if (mousePressed && (e->buttons() && Qt::LeftButton) && !max) {13 this->move(e->globalPos() - mousePoint);14 e->accept();15 }16 }1718 void frmMain::mousePressEvent(QMouseEvent *e)19 {20 if (e->button() == Qt::LeftButton) {21 mousePressed = true;22 mousePoint = e->globalPos() - this->pos();23 e->accept();24 }25 }2627 void frmMain::mouseReleaseEvent(QMouseEvent *)28 {29 mousePressed = false;30 }2:图形字体的使⽤这⾥直接⽤的是⽹上的IconHelper类,也不知道最初作者是谁,反正代码也就⼏⾏,不难。
Qt编写自定义控件插件路过的坑及注意事项

Qt编写⾃定义控件插件路过的坑及注意事项Qt⾃定义插件注意事项:1:每个Qt库bin⽬录的designer可执⾏⽂件都是和该库同⼀个编译器编译的,可⽤,如果想要集成到Qt Creator中,则需要注意版本,⼀般在windows上的Qt Creator版本是MSVC的,则需要对应的Qt库也是MSVC编译的,库版本和编译器版本必须保持⼀致才能是顺利集成到Qt Creator的重要前提。
2:⾃定义控件的名称不能⼩写,否则拖过去的控件⾃动⽣成的默认名称和类名⼀样,会编译通不过。
这个问题坑了我很久,造成⾃动⽣成的UI代码保存,⼀直没有怀疑,后⾯才发现⾃动⽣成的代码类名和实例名称⼀样,冲突导致的。
3:⾃定义控件类头⽂件引⼊,Qt5.7以下版本为#include <QtDesigner/QDesignerExportWidget> 以上版本为#include<QtUiPlugin/QDesignerExportWidget>4:类名前必须加⼊ QDESIGNER_WIDGET_EXPORT 宏。
否则集成到Qt Creator 中编译会报错。
不加的话可以在设计器中加载,但是编译会报错。
5:如果将⽣成好的dll⽂件放到Qt库⽬录下的 plugins\designer 下,可以在 designer 中看到。
放到Qt Creator下的 bin\plugins\designer 则可以集成到Qt Creator中。
6:将⾃定义控件的头⽂件、dll⽂件、lib(mingw编译器为.a)⽂件复制出来,放到include(可⾃⼰随便命名,我这⾥习惯⽤include)⽬录,将include⽬录放到项⽬的源码⽂件下,在使⽤了⾃定义控件的项⽬的pro⽂件中,增加两⾏ INCLUDEPATH += $$PWD/include LIBS += $$PWD/include/***.lib(mingw编译器为.a) ,这样可以正常编译,但是编译完成后不能运⾏,还需要将对应⾃定义控件的dll⽂件复制到可执⾏⽂件同⼀⽬录即可,⾄此⼤功告成。
Qt之界面换肤的两种方式

Qt之界面换肤的两种方式概述•像现在市面上有很多软件都有换肤功能,例如:QQ、360、迅雷等。
换肤其实很简单,并没有想象中那么难,下面介绍两种实现换肤的方式,仅供参考!方式一1. 实现原理•创建多个QSS文件•首先,根据界面不同的版式创建多个QSS文件,例如,black.qss,blackblue.qss,gray.qss等,将其加入资源文件。
Qt样式表的动态加载如下:QFile file(":/qss/black.qss");file.open(QFile::ReadOnly);QString styleSheet = QLatin1String(file.readAll());qApp->setStyleSheet(styleSheet);file.close();•每一个QSS文件编写对应控件的样式//QMenu样式(black.qss)QMenu::item{background-color: #333333;padding: 5px 10px 5px 10px;margin:5px 5px 10px 10px;}QMenu::item:disabled{color: #666666;}QMenu::item:selected{background: #333333;color: #FEFEFE;border: 1px solid transparent;}QMenu::separator{height: 1px;background: transparent;margin: 10px 1px 10px 1px;}QMenu::indicator{width: 13px;height: 13px;}•界面换肤时,进行切换•界面上可以通过不同的按钮进行加载不同的QSS文件,以此达到换肤功能。
方式二1. 实现原理•创建一个QSS文件•首先,创建一个后缀名为QSS文件,例如style.qss,将其加载到资源文件中(qrc)。
千千静听自己制作皮肤教程

2008年12月25日更新:增加在线歌曲的缓冲进度条皮肤元素。
命名:progress_fill2.bmp一、了解千千静听皮肤制作是怎么一回事?1、如果您是位从未接触过皮肤制作的人,那么请先仔细看下面的这段话:如何把设计好的皮肤效果图应用到千千静听软件上去,有两个主导思想您应该了解:一个是需要把效果图上面的控件(或称按钮)单独切出来,另一个是需要把上一点说的控件(或称按钮)的坐标找到,为它精准定位,是不是听的有点眉目了,那么我们接着往下讲。
2、千千的皮肤位于安装目录下的Skin文件夹内,扩展名可以为.skn或.zip,实际上二者是一样的。
对于前者,可以先将.skn的扩展名改为.zip(要在系统中显示文件的扩展名,依次点击"工具"-"文件夹选项"-"查看",再把"隐藏已知文件类型的扩展名"前的小勾去除即可),然后将其解压到单独的文件夹,进入该文件夹,可以发现里面包含了许多bmp格式的图片和若干个xml文件,他这些文件便是皮肤的组成部分了,bmp图片是各个窗口的背景及按钮图片,Skin.xml则是配置文件,定义了皮肤的基本信息、窗口及按钮的位置、大小等,它是基于XML格式的文件,可直接用系统自带的记事本或者其它文本编辑工具打开的。
好,了解以上的基础知识后,我们就开始学习实际的制作过程。
二、开始制作啦!按照四个步骤进行:(A)切图(B)修改配置文件(C)打包成皮肤文件(D)应用皮肤(A)切图:用PS或FW打开设计效果图,整体观察一下,下面讲一下哪些图片是要单独切出来的以及图片的命名。
一、主窗口的控件(1)主窗口背景命名:player_skin.bmp重点:边缘小圆角的镂空处理,把镂空填充成(#ff00ff)这个颜色,要细心处理这部分哦,边缘要1像素1像素的填充(如上图,镂空部分的颜色处理)(2)最小化按钮(4个状态)命名:minimize.bmp重点:凡是功能按钮都要做4种状态,并把这四种状态做在一张图里,存储成.BMP格式,注意每种状态按钮他的宽度和高度要一致,说一下每种状态代表的含义第一个状态:自然状态第二个状态:鼠标划过时的状态第三个状态:鼠标按下去时的状态第四个状态:按钮失效时的状态(举个例子,比如播放列表只有一首歌曲,那么“下一首”按钮就是无法点击的,那么此时这个按钮状态就是失效时的状态)3)迷你模式按钮命名:minimode.bmp同上,这里不再赘述了。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
3.按钮的制作
对于表皮中的图像按钮,设置它的父类是QButton,这种按钮由两幅图片构成,一幅图片是正常状态(Normal),一幅图片是按钮按下时的状态(Activated)。有时也可以设置成四种状态,即增加禁止状态(Disabled)和鼠标指针进入时的状态(Hovered)。
下面是程序运行结果之一:
void SkinDem:mouseMoveEvent(QMouseEvent *e){QPoint newpos = e->globalPos();QPoint upleft = pos0 + newpos - last;move(upleft);}void SkinDem:mousePressEvent(QMouseEvent *e){last = e->globalPos();pos0 = e->globalPos() - e->pos();}
QBitmap bm;bm = *(Pixmaps[MASK]);setMask(bm);setBackgroundPixmap(*Pixmaps[BACKGROUND]);
2.窗口的移动
由于上述窗口不受窗口管理器的管理的特性,所以移动窗口需要特殊处理,一般的方法是截取根Widget的鼠标按钮事件,自己处理鼠标点击和移动的事件。
软件界面的风格变化可以通过两种机制完成,一种是通过设置主题(Themes),它使用界面库本身所具有的对界面组件(Components)的控制能力切换显示风格;另外一种是通过提供不同系列的图片来切换显素值得考虑:
1.使用无边界的窗口
在XWindow下,无边界的窗口是指不受窗口管理器管理的边界不规则的窗口。由于不受窗口管理器管理管理,所以软件窗口界面没有附加的标题条(Title Bar)等。在Qt中,建立无边界窗口的最简单的方法是设置QWidget的WFlags的值是WStyle_NoBorder。它定义在qnamespace.h中。不规则窗口的特点则要求对整个窗口使用图像掩码。使用X窗口形状的扩展(X Shape Extension)来达到要求。在Qt中可以直接使用,
在例子(qt-skin-example.tar.gz)中,我们重新定义了鼠标按下和鼠标移动的事件处理函数,并且含有按钮的所有信息,主工作区的所有信息等。主工作区的信息是它的位置和尺寸,主窗口的信息是它所使用的背景图片和图片的掩码(用来制造不规则窗口),所以整个主窗口的大小可以由图片的尺寸来决定。几个按钮的信息包含它们的位置,它们的大小由图片的大小来决定。