【QT QSS系列】QSS语法深入及开发设计

本文详细讲述了在QT项目中使用QSS进行Windows和Linux平台UI开发时遇到的问题,包括不同平台样式差异、QSS语法总结、选择器应用以及通用UI结构设计。同时解析了控件在不同操作系统下的坐标问题原因和解决方案。
摘要由CSDN通过智能技术生成

一、前言

最近项目正在进行QT开发,UI主要用QSS形式,主要针对windows和linux平台,开发流程为在windows上开发大概成品后,部署到linux环境上。过程中发现,QT对于windows和linux不同平台,UI呈现形式不同,碰到各种奇怪问题,这边对QT各类问题及用到的QSS进行总结,并设计一种基于现有xml形式的UI结构,方便后续QT界面模块开发。后续也会对另一种QML形式的GUI进行学习总结,方便混合开发。

【debug问题点】:QT QSS GUI
【环境】:windows linux
【使用工具】:QT

二、QSS语法总结

2.1、常见方法

2.1.1、Qt Designer

在这里插入图片描述

如上图,可以通过 右键按钮->改变样式表 或者 右边属性框中的styleSheet 访问到控件的样式表,进行QSS编写。
使用该方式的好处在于,可以直观看到设计效果,通过Ctrl+R就可以预览窗体设计。并且在编辑样式表窗口中添加资源、添加渐变、添加颜色、添加字体,方便直接编辑特定样式的颜色。

!!!重点】:此类方式编辑的样式表默认作用于当前控件及其所有子控件,符合QT 父子控件继承的设计思想,当然QT也提供了相应QSS语法,能够屏蔽掉继承的影响,详见2.2.3选择器。

2.1.2、QSS文件读写

使用QFile读入样式表,使用setStyleSheet进行设置。对不同控件生效的示例代码如下:

QApplication app(argc, argv);
QFile qss("StyleSheet.qss");
qss.open(QFile::ReadOnly);

/* 此通过加载StyleSheet文件,对整个软件的所有控件样式进行设置。*/
app.setStyleSheet(qss.readAll());
/* 对单一类的ui对象设计样式。*/
this->setStyleSheet(qss.readAll());
/* 对ui对象中的控件设计样式。*/
ui->pushButton->setStyleSheet(qss.readAll());

qss.close();

!!!重点】:上面两种方法的本质,其实都是通过setStyleSheet接口将带有QSS语法的字符串设置进控件。可以看见:
第一种方法,QT会在ui文件中自动生成:pushButton->setStyleSheet(QString::fromUtf8("xxx");
第二种方法则是通过读取文件内容进行设置,显示调用setStyleSheet。

2.2、常见语法

2.2.1、基础语法

QSS同CSS语法规则类似,形式如下:

selector { 
	attribute:value
};

其中:
selector选择器:通常情况下为控件类名(如QPushButton);
attribute属性:待设置的样式表属性(如background-color);
value值:属性赋值(如rgb(40, 85, 20););

2.2.2、共享属性

QCheckBox,QComboBox,QSpinBox{
	color:rgb(255,0,0);
	background-color:rgb(255,255,255);
	font:bold;
}

这样就设置了所有作用范围内的QCheckBox、QComboBox、QSpinBox的前景色、背景色和字体。

2.2.3、选择器(selector)

Qt样式表支持CSS2中定义的所有选择器。下表总结了最有用的选择器类型。
这里是引用

2.2.4、伪状态(Pseudo-States)

用户在操作时,可以根据不同的交互状态展示不同的用户样式,界面能够识别用户操作,不需要代码控制即可响应不同状态下的样式。例如:

QPushButton {
    border: 1px solid #555;
    padding: 4px;
    min-width: 65px;
    min-height: 12px;
}
/* 悬浮效果 */
QPushButton:hover {
    background-color: #999;
}
/* 按下效果 */
QPushButton:pressed {
    background-color: #333;
    border-color: #555;
    color: #AAA;
}

常见的控件效果可以自行百度,基本是用到啥查啥,这里不赘述。

三、通用UI结构设计

待更新

四、常见问题分析

4.1、QT在不同操作系统呈现不同样式,控件效果不同,为什么?

答:QT在不同平台默认的样式QStyle不同,QT内置组件都是通过QStyle来进行绘制,通过设置内置样式能够保证在不同运行平台绘制的效果一致。
在linux系统下,通过qDebug() << QStyleFactory::keys(); 打印了(“Windows”, “Fusion”);
系统默认是’Fusion’风格,就是特别奇怪的那种风格,comboBox控件的下拉界面坐标位置显示也不对。
我们可以通过下面代码将风格设置成windows。
ui->comboBox->setStyle(QStyleFactory::create("Windows"));

4.2、QT在windows下全局坐标正常,为什么Linux下坐标会乱飘?

答:暂时没有查到非常有效的原理解释,不过在项目开发中发现了一些规律。
1)在类构造函数中,如果去setGeometry或者move设置控件坐标,可能会导致控件坐标不准确。这可能是因为在构造中QT有些初始化工作没有做完,导致计算坐标数据不对。可以在构造后进行重新设置。
2)在对继承QWidget类型的窗口,show进行显示的上下文代码中,进行move设置坐标,windows下是正常的。在这里插入图片描述
但是linux环境下,先move后show的代码,会导致控件位置乱飘。需要使用先show后move的代码顺序。这可能是因为show接口内部可能对控件坐标进行了更新,导致坐标不准;在show后进行move,等于重新进行坐标计算。

  • 45
    点赞
  • 62
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: Qt是一种跨平台的图形用户界面(GUI)开发工具箱,可以用来开发各种桌面和嵌入式应用程序。QSSQt Style Sheets)是Qt提供的一种用于定义界面样式的机制,类似于CSS(Cascading Style Sheets)。 使用QtQSS开发设计界面可以实现丰富多样的用户界面效果。下面以一个简单的登录界面为例,来展示如何使用QtQSS进行开发设计。 首先,在Qt Creator中创建一个新的Qt Widgets应用程序项目。然后,在设计界面时,可以使用Qt提供的各种控件,如QPushButton、QLineEdit、QLabel等,将它们拖拽到界面上进行布局。 然后,打开Qt的样式编辑器,可以通过编辑QSS文件来定义界面的样式。例如,可以设置按钮的背景颜色、字体大小和颜色等。还可以设置文本框的边框样式、文本对齐方式等。通过编辑QSS文件,可以灵活地定义界面的外观和风格,以满足设计需求。 接下来,在Qt代码中引用QSS文件。可以通过在代码中使用QApplication的setStyleSheet()函数来加载QSS样式文件,从而应用定制的界面样式。 最后,编译并运行应用程序,即可看到设计好的界面以及应用的QSS样式效果。 总结来说,QtQSS结合的开发设计界面示例可以实现丰富多样的用户界面效果。通过在Qt Creator中设计界面,并通过编辑QSS文件来定义界面的样式,可以实现自定义外观和风格。同时,通过在Qt代码中引用QSS文件,可以将定制的界面样式应用到应用程序中,从而实现所需的界面效果。 ### 回答2: Qt QSSQt Style Sheets)是一种用于定制Qt应用程序界面外观的机制,它基于CSS语法。通过使用QSS开发人员可以轻松地设计和定制界面的外观,使其符合应用程序的需求和风格。 以一个简单的示例来说明如何使用Qt QSS开发设计界面。假设我们要创建一个包含按钮的窗口,其中按钮有不同的风格和颜色。 首先,我们需要在Qt应用程序中导入Qt QSS模块,可以通过以下代码实现: ```cpp #include <QApplication> #include <QFile> int main(int argc, char *argv[]) { QApplication a(argc, argv); // 导入QSS样式表 QFile qssFile(":/styles.qss"); qssFile.open(QFile::ReadOnly); QString qss = QLatin1String(qssFile.readAll()); qApp->setStyleSheet(qss); // 创建窗口和按钮 // ... return a.exec(); } ``` 接下来,我们可以创建一个样式表文件styles.qss,并在其中定义按钮的外观样式。例如: ```css /* 设置按钮的通用样式 */ QPushButton { background-color: #008080; color: white; font-size: 14px; border: none; padding: 5px 10px; } /* 设置按钮的悬停样式 */ QPushButton:hover { background-color: #00BFFF; } /* 设置按钮的按下样式 */ QPushButton:pressed { background-color: #00008B; } ``` 在样式表文件中,我们使用了CSS的语法来定义按钮的样式。在上述示例中,我们设置了按钮的背景颜色、字体颜色、字体大小、边框和内边距等。 最后,我们将样式表文件导入到Qt应用程序中,并将其应用到整个应用程序中,这样所有的按钮都会应用上述定义的样式。通过在QSS文件中定义不同的样式,我们可以实现定制化的界面设计。 总而言之,Qt QSS提供了一种简单而灵活的方式来开发设计界面。通过导入和应用QSS样式表,我们可以轻松地定制和改变Qt应用程序的外观,以满足用户需求和个性化要求。 ### 回答3: Qt(跨平台C++应用程序开发框架)是一种强大的工具,提供了丰富的GUI设计功能,而QSSQt样式表)是一种用于美化Qt应用程序界面的样式表语言。 使用QtQSS进行开发设计界面示例非常简单。首先,我们需要创建一个基于Qt的应用程序项目,并使用Qt Creator这样的集成开发环境进行开发。 然后,在界面文件中,我们可以使用Qt的各种控件(如按钮、标签、文本框等)进行布局和设计。通过设置这些控件的属性,我们可以自定义它们的外观和样式。 接下来,我们可以使用QSS来为应用程序添加样式和美化效果。QSS使用类似于CSS的语法,可以为控件指定各种样式属性,如背景颜色、字体、边框等。 例如,我们可以使用QSS来设置按钮的样式,代码如下: QPushButton{ background-color: #ff0000; color: #ffffff; border: 1px solid #000000; } 这段代码将设置所有QPushButton的背景颜色为红色,字体颜色为白色,边框为1像素宽的黑色边框。 在应用程序中,我们只需要在需要应用样式的控件上设置相应的QSS代码即可。当应用程序运行时,它会自动应用这些样式,从而实现设计界面的目的。 通过灵活运用QtQSS,我们可以实现丰富多样的界面设计,使应用程序更加美观和易于使用。无论是简单的界面布局还是复杂的动画效果,QtQSS都能满足我们的需求,并提供高度可定制的界面设计方案。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值