qt设置界面背景自定义颜色

一直梦寐以求能像VC一样可以很方便的有个自定义的界面,QSS的强大让我看到了很好的希望,辗转百度谷歌无数次,一直搜索QT相关的换肤文章,绝大部分的是一些简单的按钮文本样式,要做到整体换肤程度几乎不行,QTCN论坛里的奋斗的孩子写了个模仿360安全卫士系列,让我既惊喜有遗憾,惊喜的是能够用QT实现一个这么完整的360安全卫士界面,确实不错,也支持多种换肤,遗憾的是我下载过的是VC版本的,对于一直执着于用Qt Creator 来开发的我来说,不大喜欢,工程文件之多之复杂,对于追求精简美的我来说更是觉得别扭,当然源码学习参考价值还是很高的,只是个人不大喜欢而已。

陆续看过slientman的QT整体换肤方案,链接地址:***/slientman/article/details/5618950也从CSDN下过该可执行文件,也不知道是作者粗心还是故意,居然没有自带QT运行库,导致我电脑上试过几个版本的运行库都不行,作者也说了,花了很多精力,不打算开源,这个对于喜欢分享的我来说,心里又是一睹,不过本人还是带着诚意加过作者QQ,愿意自费购买一套,也一直没有得到作者的回复,有点失望。后面又在博客园里面看到24K纯开源(***blogs.com/csuftzzk/)、文艺IT男(***blogs.com/appsucc/)、 liulun(***blogs.com/liulun/)等几位大侠写过的类似工具,尤其是这篇文章(***blogs.com/liulun/p/3775294.html)让我认识到了还有fontawesome这个好东西,真心感谢作者!

在看过这么多习惯文章后,着手开始自己的QUI编写过程,一开始设想的是参照这篇文章***blogs.com/appsucc/p/3257661.html来进行开发,封装成一个DLL,提供外部接口给需要加上皮肤的窗体调用,当开发完成之后,才发现还是会有一系列的问题,例如当主窗体需要关闭时,需调用this.parent().close()类似方法才可以关闭窗体,而且必须是QWidget才能加入到子窗体中,当有相关QDialog窗体打开需要给出返回值时,不能方便的提供done(1)这样的方法返回,后面索性抛弃了这种做法,还是采用QSS样式调用,相关样式都已经在样式表中写好,无非就五种颜色,采用了上下两种渐变颜色,normal两种,hover(select,focus等)两种,还有一个是文字颜色,只要将对应样式表替换这五种颜色即可,当然大部分时候替换的是四种颜色,文字颜色默认为白色,通用绝大部分渐变颜色。

核心处理部分:

1:无边框窗体处理

对标题栏安装eventFilter事件监听器监听鼠标双击事件,重载mouseMoveEvent、mousePressEvent、mouseReleaseEvent三个事件实现鼠标拖动,当窗体改变大小后还必须用QRect location;来记住当前窗体位置,方便按下右上角还原按钮时将窗体设置在最大化前的位置。

部分代码如下:

 bool frmMain::eventFilter(QObject *obj, QEvent *event) { if (event->type() == QEvent::MouseButtonDblClick) {this->on_btnMenu_Max_clicked();return true;}return QObject::eventFilter(obj, event); } void frmMain::mouseMoveEvent(QMouseEvent *e) { if (mousePressed && (e->buttons() && Qt::LeftButton) && !max) { this->move(e->globalPos() - mousePoint);e->accept();} } void frmMain::mousePressEvent(QMouseEvent *e){ if (e->button() == Qt::LeftButton) { mousePressed = true; mousePoint = e->globalPos() - this->pos(); e->accept(); } } void frmMain::mouseReleaseEvent(QMouseEvent *) { mousePressed = false;}

2:图形字体的使用

这里直接用的是网上的IconHelper类,也不知道最初作者是谁,反正代码也就几行,不难。

贴出CPP实现文件代码

 #include "iconhelper.h" IconHelper* IconHelper::_instance = 0; IconHelper::IconHelper(QObject*): QObject(qApp) { int fOntId= QFontDatabase::addApplicationFont(":/image/fontawesome-webfont.ttf"); QString fOntName= QFontDatabase::applicationFontFamilies(fontId).at(0); icOnFont= QFont(fontName); } void IconHelper::SetIcon(QLabel* lab, QChar c, int size) { iconFont.setPointSize(size); lab->setFont(iconFont); lab->setText(c); } void IconHelper::SetIcon(QPushButton* btn, QChar c, int size) { iconFont.setPointSize(size); btn->setFont(iconFont); btn->setText(c);}

在主窗体的构造函数中这样调用即可。

IconHelper::Instance()->SetIcon(ui->btnMenu_Close, QChar(0xf00d), 10);

右上角最大化按钮会有两个图标,最大化时候一个,还原时候一个,所以这里在事件中这样处理的。

void frmMain::on_btnMenu_Max_clicked() { if (max) { this->setGeometry(location); IconHelper::Instance()->SetIcon(ui->btnMenu_Max, QChar(0xf096), 10); ui->btnMenu_Max->setToolTip("最大化"); } else { location = this->geometry(); this->setGeometry(qApp->desktop()->availableGeometry());IconHelper::Instance()->SetIcon(ui->btnMenu_Max, QChar(0xf079), 10); ui->btnMenu_Max->setToolTip("还原"); } max = !max; }

3:自定义弹出信息框、询问框、错误框

我比较偷懒,直接用新建的UI窗体来实现,对信息框、询问框、错误框的判断直接在setmessage函数中处理。

 void frmMessageBox::SetMessage(const QString &msg, int type){ if (type == 0) { ui->labIcoMain->setStyleSheet("border-image: url(:/image/info.png);"); ui->btnCancel->setVisible(false); ui->lab_Title->setText("提示"); } else if (type == 1) { ui->labIcoMain->setStyleSheet("border-image: url(:/image/question.png);"); ui->lab_Title->setText("询问"); } else if (type == 2) { ui->labIcoMain->setStyleSheet("border-image: url(:/image/error.png);");ui->btnCancel->setVisible(false); ui->lab_Title->setText("错误");} ui->labInfo->setText(msg); }

4:设置全局皮肤样式

//设置皮肤样式 static void SetStyle(const QString &styleName){QFile file(QString(":/image/%1.css").arg(styleName)); file.open(QFile::ReadOnly); QString qss = QLatin1String(file.readAll()); qApp->setStyleSheet(qss); qApp->setPalette(QPalette(QColor("#F0F0F0"))); }

myHelper::SetStyle("black");//黑色风格

QT自定义精美换肤界面

myHelper::SetStyle("blue");//蓝色风格

QT自定义精美换肤界面

myHelper::SetStyle("gray");//灰色风格

QT自定义精美换肤界面

myHelper::SetStyle("navy");//天蓝色风格

QT自定义精美换肤界面

特点:

1:无边框窗体,自定义标题栏,鼠标拖动,大小缩放,双击切换。

2:除了少量的几个图片资源外,几乎使用QSS写完所有颜色样式控制。

3:自定义一个QMessageBox对话框,自动换行显示提示信息,可以很方便的调用。

信息框:myHelper::ShowMessageBoxInfo

QT自定义精美换肤界面

询问框:myHelper::ShowMessageBoxQuesion

QT自定义精美换肤界面

错误框:myHelper::ShowMessageBoxError

QT自定义精美换肤界面

4:使用fontawesome图形字体库,将互联网的优秀资源应用于QT中。

5:彻底公开源码,可以任意随意使用。

6:QT各个版本都可以编译通过,亲测无误。

7:自带提供了四种样式黑色、蓝色、灰色、天蓝色风格供选择,可以自由更改image文件夹下的样式,也可以自己增加一些样式。

代码肯定还有很多不完善的地方,不能通用于任何项目,肯定需要修改不少代码才可以用于自己的项目,如果有更好的建议,非常欢迎提出来!

【领QT开发教程学习资料,点击下方链接莬费领取↓↓,先码住不迷路~】

点击这里:「链接」

原文链接:***blogs.com/feiyangqingyun/p/3915657.html

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:dandanxi6@qq.com

(0)
上一篇 2023年 5月 30日 下午2:22
下一篇 2023年 5月 30日 下午2:44

相关推荐

  • 微信公众号怎样设置自动回复内容

    小客服 大家一定都清楚微信公众号的输入关键字就自动回复功能,像这样,我进入一个指定的微信公众号,在聊天界面发送关键字,比如:英语四六级,立马就会弹出相应的资料或链接给我。但是这种便…

    2023年 9月 11日
  • 微店模式与淘宝模式的区别(微店运营产品的核心卖点描述文章)

    Hello大家好,我是高老师,那么在这几天我们的电商问答里边,大家提的问题已经越来越多了,今天和大家回答的一个问题是微信上怎么去开网店?那么微信上开店的话,你看你是个人还是公司,你…

    2023年 1月 1日
  • 快递丢失损坏怎么赔偿(快递丢失快递员赔还是公司赔)

    快递丢件时,你有没有遇到过这种情况? 联系快递员:我只是代送的,你找商家~ 联系商家:快递员送丢的,找快递公司啊 联系快递公司:找代收站点,他们具体负责的 联系站点:你找快递公司总…

    2023年 2月 3日
  • 公众号模版消息是什么,微信公众号怎么编辑图文模板

    公众号模板消息,向认证后的服务号开放。所有服务号都可以在功能->添加功能插件处看到申请模板消息功能的入口,但只有认证后的服务号才可以申请模板消息的使用权限并获得该权限。 模板…

    2023年 2月 19日
  • python爬取书籍信息

    前言 文的文字及图片来源于网络,仅供学习、交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理。 PS:如有需要Python学习资料的小伙伴可以加点击下方…

    2023年 5月 1日
  • 被好友拉黑怎么拖出微信黑名单(微信被好友拉黑怎么显示黑名单)

    高高兴兴去找微信好友聊天时,突然出现一个红色感叹号提示你们已经不是好友,心里作何感想?如果不是很亲近的人,被莫名删除的确比较膈应,但其实影响不大,但如果是关系较好的朋友或者十分亲密…

    互联网 2023年 10月 4日
  • 怎么免费兑换会员

    爱奇艺,优酷,腾讯三大视频播放平台关于会员收费的新闻接二连三,就两个字涨价。优酷明确规定,会员账号只能登陆一个手机,爱奇艺投屏,选择清晰度有限制,想更高清晰度需要买电视版会员。 现…

    2023年 3月 12日
  • 火箭对雷霆直播地址(nba西部决赛雷霆vs火箭)

    齐鲁网讯 北京时间11月17日,火箭今天做客俄城,客场挑战雷霆。此役休战4场的帕特里克-贝弗利伤愈复出并且回归首发阵容,但是赛前主帅凯文-麦克海尔表示黑贝的上场时间将会受到限制。伤…

    2023年 9月 16日
  • 支付宝双十一部分功能无法使用

    从天猫双十一的销售额来看,支付宝在此前采取的多种授信提额政策十分成功,同时支付宝也给行业一个启示:消费金融C端流量愈发见顶,深耕存量市场才是王道。 撰文 | 陈大柴 「热浪财经」获…

    2023年 1月 11日
  • 水印怎么去除?(有水印的如何去除水印)

    现在很多平台会在用户保存视频的时候自动给视频添加一个平台的水印,这在一定程度上影响了它的美观和使用。 下面我来分享几个视频去水印方法,操作简单还不会损坏视频画质哦! 方法一:Pr …

    2023年 9月 25日