由于某些原因,本人对于UI美化十分热衷,平生最大的想法就是做一个“让我的小伙伴们都惊呆了”的UI程序,跟随工作转辗折腾,始终不遂愿,后来接触了HtmLayout和Sciter疯狂了好几周,翻译N多文章,最终因为文档的原因不得不放弃了。哎呀,跑题了......

     以上都不是重点,重点是今天要解决的Qt样式表美化程序的问题,当让,如今的Qt已经步入5.2的牛叉版本,跨平台并且支持Qml界面,支持所有的手机应用开发,简直是开发神器!是优点又是缺点,它才出生就这么强大,肯定免不了这样那样的问题,相比较已经更新维护了10多年的V4.xx版本,4版本才是真正应该好好学会的核心内容。so,......

    不要理会上面的内容,都是瞎诌的。下面来讲如何定制一个可修改的程序样式表文件,即通过文件加载Qt Style sheets内容。

-----------------------------------

    在这之前,让我们先梳理一下思路:

1、Qt Style sheets是一些90%等价于CSS的文本内容。

2、Qt不提供直接加载样式文件的办法,但是对所有的Qwidget提供了setStyleSheet()函数。

3、Qt的样式表相对关系完全和CSS类似,可以在Dialog中设置自身所有子控件甚至其他Dialog中的类型Style。

    鉴于以上原因,我们可以直接写一个CSS文件,在程序启动时,主动读取,并且加载到主窗口中,然后Qt引擎会自动解析和绘制User Custom Style。

------------------------------------

下面,开始正式的处理:

准备工作:

1、新建一个Qt项目,简单起见,基于QDialog。然后再上放一些常用的控件,以便于测试和观察。

2、书写一个加载CSS文件并且设置样式的函数,以便于测试,以后每次都可以不用重新编译。(当然,Qt支持直接书写style到xx.ui文件,需要重新编译)


原始界面:


加载函数:(默认加载exe所在目录default.css文件)

void MainDlg::InitUI()
{
    // 给ComBox添加一些测试文本
    QString strContent;
    for(int i=0;i<10;i++)
    {
        strContent.sprintf("Text%.2d",i);
        ui->comboBox->addItem(strContent);
    }
    emit ui->comboBox->setCurrentIndex(0);

    // 加载CSS文件
    QString strPath = QCoreApplication::applicationDirPath();
    qDebug()<<strPath;
    QString strCssFile = strPath + "/default.css";
    QFile fCss(strCssFile);
    if( !fCss.open(QFile::ReadOnly))
    {
        qDebug("css File %s load false",strCssFile);
        return;
    }
    QString strCssContent(fCss.readAll());
    setStyleSheet(strCssContent);
    fCss.close();
}


在exe所在目录,新建一个default.css文本文件。

编译,运行,没有错误后就可以进行下一步了。

---------------------------------------

CSS文件内容:

书写CSS更多地需要一些html和CSS基础,这个方面谁也帮不了,不会的童鞋请自行学习或了解。

Qt的伪状态和特殊属性请参考前两篇文章:

http://blog.csdn.net/bbdxf/article/details/22746863

http://blog.csdn.net/bbdxf/article/details/22746307

http://blog.csdn.net/bbdxf/article/details/22745675


下面直接贴出一个样例文本:

QDialog#MainDlg{
	background-image: url("bg.png");
	border: 1px solid #999;
	border-radius: 5px;
}

QPushButton{
	color:white;
	border-radius:3px;
	background-color: black;
}
QLabel{
	color:blue;
}

QLineEdit{
	text-align: center;
	color:red;
	background-color: transparent;
	border: 1px solid white;
	selection-color:yellow;
	selection-background-color:green;
}
QRadioButton{
	color: slateblue;
}
QRadioButton::indicator:on{
	background-image: url("1.gif");
}
QComboBox{
	min-width: 4em;
	background-color: transparent;
}
QComboBox:on{
	color:red;
}
QComboBox:off{
	color:black;
}
QComboBox QAbstractItemView {
    border: 1px solid black;
    color:black;
    selection-color: red;
    selection-background-color: green;
}

QProgressBar{
	border: 1px solid #999;
	border-radius:5px;
	text-align: center;
	background-color: transparent;
}

QProgressBar::chunk {
    background-color: #CD96CD;
    width: 10px;
}

下面是使用样式之后的界面:



-----------------------------------------

至此,我们就可以随意修改css文件然后启动程序查看效果了,是不是很有意思!!


更多列子可以在Qt 帮助文档中搜索 Qt Style Sheets Examples就可以查看官方的一些空间美化的例子了!祝大家好运!


-----------------------

控制的3种方式// 根据ObjectName定制


// 根据ObjectName定制
QPushButton#evilButton {
	background-color: red;
	border-style: outset;
	border-width: 2px;
	border-radius: 10px;
	border-color: beige;
	font: bold 14px;
	min-width: 10em;
	padding: 6px;
}
QPushButton#evilButton:pressed {
	background-color: rgb(224, 0, 0);
	border-style: inset;
}
QPushButton::menu-indicator {
    image: url(myindicator.png);
    subcontrol-position: right center;
    subcontrol-origin: padding;
    left: -2px;
}

// 复合控制

 QLineEdit { color: red }
 QLineEdit[readOnly="true"] { color: gray }
 #registrationDialog QLineEdit { color: brown }

// 动态属性,setProperty

*[mandatoryField="true"] 
{ 
	 background-color: yellow
}




Logo

讨论HarmonyOS开发技术,专注于API与组件、DevEco Studio、测试、元服务和应用上架分发等。

更多推荐