跨平台应用开发框架(3)-----Qt(样式篇)

目录

1.QSS

1.基本语法

2.QSS设置方式

1.指定控件样式设置

2.全局样式设置

1.样式的层叠特性

2.样式的优先级

 3.从文件加载样式表

4.使用Qt Designer编辑样式

3.选择器

1.类型选择器

2.id选择器

3.并集选择器

4.子控件选择器

5.伪类选择器

4.样式属性

1.盒模型

1.设置边框和内边框

2.设置外边距

5.控件样式示例

1.按钮

2.输入框

3.复选框

4.单选框

5.列表

6.菜单栏

2.绘图

1.绘制线段

2.绘制矩形

3.绘制圆形

4.绘制文本

5.设置画笔

6.设置画刷

7.绘制图片

8.QPixmap

2.QImage

3.QPicture


1.QSS

        QSS 的功能类似于网页开发中的 CSS(层叠样式表),它允许开发者通过一种声明式的语法来控制界面元素的外观,包括颜色、字体、边框、背景等诸多方面。

1.基本语法

选择器 {属性名: 属性值; 
}
QPushButton {color: red;
}
Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);ui->pushButton->setStyleSheet("QPushButton {color:red;}");
}

2.QSS设置方式

1.指定控件样式设置

        给widget设置样式

Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);this->setStyleSheet("QPushButton {color:red;}");
}

2.全局样式设置

        通过QApplication的setStyleSheet方法设置全局样式

int main(int argc, char *argv[])
{QApplication a(argc, argv);a.setStyleSheet("QPushButton{color:red;}");Widget w;w.show();return a.exec();
}

1.样式的层叠特性

        全局样式给控件设置了属性1,指定控件样式设置了属性2,这两个属性都会产生作用

Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);ui->pushButton->setStyleSheet("QPushButton{font-size:50px;}");
}
int main(int argc, char *argv[])
{QApplication a(argc, argv);a.setStyleSheet("QPushButton{color:red;}");Widget w;w.show();return a.exec();
}

2.样式的优先级

        如果全局样式和指定控件样式冲突,则指定控件样式优先展示

Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);ui->pushButton->setStyleSheet("QPushButton{color:green;}");
}
int main(int argc, char *argv[])
{QApplication a(argc, argv);a.setStyleSheet("QPushButton{color:red;}");Widget w;w.show();return a.exec();
}

 3.从文件加载样式表

        在资源文件夹下添加style.qss文件

QPushButton{color:red;
}
QString loadQSS()
{QFile file(":/style.qss");file.open(QFile::ReadOnly);QString style=file.readAll();file.close();return style;
}int main(int argc, char *argv[])
{QApplication a(argc, argv);const QString& style=loadQSS();a.setStyleSheet(style);Widget w;w.show();return a.exec();
}

4.使用Qt Designer编辑样式

3.选择器

选择器实例说明
全局选择器*选择所有的widget
类型选择器QPushButton
选择所有的 QPushButton 和其子类的控件
类选择器.QPushButton
选择所有的 QPushButton 的控件. 不会选择子类
ID选择器#pushbutton_2
选择 objectName 为 pushButton_2 的控件
后代选择器
QDialog QPushButton
选择 QDialog 的所有后代(子控件, 孙子控件等等) 中的 QPushButton
子选择器
QDialog > QPushButton
选择 QDialog 的所有子控件中的 QPushButton
并集选择器
QPushButton, QLineEdit,
QComboBox
选择 QPushButton, QLineEdit, QComboBox 这三种控件.
(即接下来的样式会针对这三种控件都生效)
属性选择器
QPushButton[flat="false"]
选择所有 QPushButton 中, flat 属性为 false 的控件

1.类型选择器

int main(int argc, char *argv[])
{QApplication a(argc, argv);a.setStyleSheet("QWidget{color:red;}");Widget w;w.show();return a.exec();
}

2.id选择器

int main(int argc, char *argv[])
{QApplication a(argc, argv);QString style="";style+="QPushButton{color:yellow;}";style+="#pushButton{color:red;}";style+="#pushButton_2{color:green;}";a.setStyleSheet(style);Widget w;w.show();return a.exec();
}

3.并集选择器

int main(int argc, char *argv[])
{QApplication a(argc, argv);a.setStyleSheet("QPushButton,QLabel,QLineEdit{color:red;}");Widget w;w.show();return a.exec();
}

4.子控件选择器

int main(int argc, char *argv[])
{QApplication a(argc, argv);QString style="";style+="QComboBox::down-arrow{image:url(:/Down.png)}";a.setStyleSheet(style);Widget w;w.show();return a.exec();
}

5.伪类选择器

伪类选择器说明
:hover
鼠标放到控件上
:pressed
鼠标左键按下时
:focus
获取输入焦点时
:enabled
元素处于可用状态时
:checked
被勾选时
:read-only
元素为只读状态时
int main(int argc, char *argv[])
{QApplication a(argc, argv);QString style="";style+="QPushButton{color:red;}";style+="QPushButton:hover{color:green;}";style+="QPushButton:pressed{color:blue;}";a.setStyleSheet(style);Widget w;w.show();return a.exec();
}

4.样式属性

1.盒模型

        ⼀个遵守盒模型的控件, 由上述几个部分构成.
Content 矩形区域: 存放控件内容. 比如包含的文本/图标等.
Border 矩形区域: 控件的边框.
Padding 矩形区域: 内边距. 边框和内容之间的距离.
Margin 矩形区域: 外边距. 边框到控件 geometry 返回的矩形边界的距离
QSS属性说明
margin
设置四个方向的外边距. 复合属性
padding
设置四个方向的内边距. 复合属性
border-style
设置边框样式
border-width
边框的粗细
border-color
边框的颜色
border
复合属性, 相当于 border-style + border-width + border-color
1.设置边框和内边框
int main(int argc, char *argv[])
{QApplication a(argc, argv);a.setStyleSheet("QLabel{border:5px solid red;padding-left:10px;}");Widget w;w.show();return a.exec();
}

2.设置外边距
Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);QPushButton* btn=new QPushButton(this);btn->setGeometry(0,0,100,100);btn->setText("hello");btn->setStyleSheet("QPushButton{border:5px solid red;margin:20px;}");const QRect& rect=btn->geometry();qDebug()<<rect;
}

5.控件样式示例

1.按钮

QPushButton {font-size: 20px;border: 2px solid #8f8f91;border-radius: 15px;background-color: #dadbde;
}
QPushButton:pressed {background-color: #f6f7fa;
}

2.输入框

属性说明
font-size
设置文字大小
border-radius
设置圆角矩形.
数值设置的越大, 角就 "越圆
background-color
设置背景颜色
QLineEdit {border-width: 1px; border-radius: 10px;border-color: rgb(58, 58, 58);border-style: inset;padding: 0 8px;color: rgb(255, 255, 255);background:rgb(100, 100, 100);selection-background-color: rgb(187, 187, 187);selection-color: rgb(60, 63, 65);
}

3.复选框

要点说明
:indicator
子控件选择器.
选中 checkbox 中的对钩部分
:hover
伪类选择器.
选中鼠标移动上去的状态
:pressed
伪类选择器.
选中鼠标按下的状态
:checked
伪类选择器.
选中 checkbox 被选中的状态
:unchecked
伪类选择器.
选中 checkbox 未被选中的状态
width
设置子控件宽度.
对于普通控件无效 (普通控件使用 geometry 方式设定尺寸)
height
设置子控件高度.
对于普通控件无效 (普通控件使用 geometry 方式设定尺寸)
image
设置子控件的图片.
像 QSpinBox, QComboBox 等可以使用这个属性来设置⼦控件的图片

4.单选框

要点说明
:indicator
子控件选择器.
选中 radioButton中的对钩部分
:hover
伪类选择器.
选中鼠标移动上去的状态
:pressed
伪类选择器.
选中鼠标按下的状态
:checked
伪类选择器.
选中 radioButton 被选中的状态
:unchecked
伪类选择器.
选中radioButton 未被选中的状态
width
设置子控件宽度.
对于普通控件无效 (普通控件使用 geometry 方式设定尺寸)
height
设置子控件高度.
对于普通控件无效 (普通控件使用 geometry 方式设定尺寸)
image
设置子控件的图片.
像 QSpinBox, QComboBox 等可以使用这个属性来设置⼦控件的图片

5.列表

要点说明
:item
选中 QListView 中的具体条目
:hover
选中⿏标悬停的条目
:selected
选中某个被选中的条目
background
设置背景颜色
border
设置边框
qlineargradient
设置渐变色
QListView::item:hover {background: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1,stop: 0 #FAFBFE, stop: 1 #DCDEF1);
}
QListView::item:selected {border: 1px solid #6a6ea9;background: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1,stop: 0 #6a6ea9, stop: 1 #888dd9);
}

6.菜单栏

要点说明
QMenuBar::item
选中菜单栏中的元素
QMenuBar::item:selected
选中菜单来中的被选中的元素
QMenuBar::item:pressed
选中菜单栏中的鼠标点击的元素
QMenu::item
选中菜单中的元素
QMenu::item:selected
选中菜单中的被选中的元素
QMenu::separator
选中菜单中的分割线
QMenuBar {background-color: qlineargradient(x1:0, y1:0, x2:0, y2:1,stop:0 lightgray, stop:1 darkgray);spacing: 3px; /* spacing between menu bar items */
}
QMenuBar::item {padding: 1px 4px;background: transparent;border-radius: 4px;
}
QMenuBar::item:selected { /* when selected using mouse or keyboard */background: #a8a8a8;
}
QMenuBar::item:pressed {background: #888888;
}
QMenu {background-color: white;margin: 0 2px; /* some spacing around the menu */
}
QMenu::item {padding: 2px 25px 2px 20px;border: 3px solid transparent; /* reserve space for selection border */
}
QMenu::item:selected {border-color: darkblue;background: rgba(100, 100, 100, 150);
}
QMenu::separator {height: 2px;background: lightblue;margin-left: 10px;margin-right: 5px;
}

2.绘图

        Qt 提供了强大的绘图系统,主要基于QPainter类。QPainter可以在QWidget(或其他绘图设备)上进行绘图操作。绘图操作通常在paintEvent函数中进行,当需要更新部件的外观时,paintEvent会被自动调用。

说明
QPainter
"绘画者" 或者 "画家".
⽤来绘图的对象, 提供了⼀系列 drawXXX 方法, 可以允许我们绘制各种图形.
QPaintDevice

“画板”

描述了QPainter把图形画到哪个对象上,像咱们之前用过的QWidget也是一种QPaintDevice

QPen

“画笔”

描述了QPainter画出来的线是什么样的

QBrush

“画刷”

描述了 QPainter 填充⼀个区域是什么样的.

1.绘制线段

void drawLine(const QPoint &p1, const QPoint &p2);参数:p1:绘制起点坐标p2:绘制终点坐标
void paintEvent(QPaintEvent *event);
void Widget::paintEvent(QPaintEvent *event)
{QPainter painter(this);painter.drawLine(QPoint(20,20),QPoint(200,20));
}

2.绘制矩形

void QPainter::drawRect(int x, int y, int width, int height);
参数:x:窗⼝横坐标;y:窗⼝纵坐标;width:所绘制矩形的宽度;height:所绘制矩形的⾼度
painter.drawRect(20,200,100,50);

 

3.绘制圆形

void QPainter::drawEllipse(const QPoint &center, int rx, int ry)
参数:center:中⼼点坐标rx:横坐标ry:纵坐标
painter.drawEllipse(QPoint(100,100),50,50);

4.绘制文本

void Widget::paintEvent(QPaintEvent *event)
{QPainter painter(this);QFont font("华文行楷",24);painter.setFont(font);painter.setPen(Qt::red);painter.drawText(QRect(100,200,600,150),"天行健,君子以自强不息");
}

5.设置画笔

        QPainter 在绘制时,是有⼀个默认的画笔的。在使⽤时也可以自定义画笔。在 Qt 中,QPen类中定义了 QPainter 应该如何绘制形状、线条和轮廓。同时通过 QPen类 可以设置画笔的线宽、颜色、样式、 画刷等。

        画笔的颜色可以在实例化画笔对象时进行设置,画笔的宽度是通过 setWidth() 方法进⾏设置,画笔的风格是通过setStyle()方法进⾏设置,设置画刷主要是通过 setBrush() 方法。

设置画笔颜色:QPen::QPen(const QColor &color) 画笔的颜色主要是通过 QColor 类设置

设置画笔宽度:void QPen::setWidth(int width)

设置画笔风格:void QPen::setStyle(Qt::PenStyle style)

void Widget::paintEvent(QPaintEvent *event)
{QPainter painter(this);QPen pen(QColor(255,0,0));pen.setWidth(3);pen.setStyle(Qt::DashLine);painter.setPen(pen);painter.drawEllipse(QPoint(100,100),50,50);
}

6.设置画刷

        在 Qt 中,画刷是使用QBrush类 来描述,画刷大多用于填充。QBrush定义了QPainter的填充模式,具有样式、颜色、渐变以及纹理等属性。

        画刷的格式中定义了填充的样式,使用Qt::BrushStyle 枚举,默认值是 Qt::NoBrush,也就是不进行任何填充。可以通过 Qt 助⼿查找画刷的格式。

void Widget::paintEvent(QPaintEvent *event)
{QPainter painter(this);QPen pen(QColor(255,0,0));pen.setWidth(3);pen.setStyle(Qt::DashLine);painter.setPen(pen);QBrush brush(Qt::cyan);brush.setStyle(Qt::Dense1Pattern);painter.setBrush(brush);painter.drawEllipse(QPoint(100,100),50,50);
}

7.绘制图片

        Qt 提供了四个类来处理图像数据:QImage、QPixmap、QBitmap 和 QPicture,它们都是常用的绘图设备。其中QImage主要用来进行 I/O 处理,它对 I/O 处理操作进行了优化,而且可以用来直接访问和操作像素;QPixmap 主要用来在屏幕上显示图像,它对在屏幕上显示图像进行了优化;QBitmap是QPixma 的子类,用来处理颜色深度为1的图像,即只能显示黑白两种颜⾊;QPicture 用来记录并重演 QPainter 命令。

void Widget::paintEvent(QPaintEvent *event)
{QPainter painter(this);painter.drawPixmap(0,0,QPixmap(":/1.jpg"));
}

        平移图片

void Widget::paintEvent(QPaintEvent *event)
{QPainter painter(this);painter.translate(100,100);painter.drawPixmap(0,0,QPixmap(":/1.jpg"));
}

        缩放图片

void Widget::paintEvent(QPaintEvent *event)
{QPainter painter(this);painter.drawPixmap(0,0,QPixmap(":/1.jpg"));painter.drawPixmap(300,400,50,60,QPixmap(":/1.jpg"));
}

        旋转图片

void Widget::paintEvent(QPaintEvent *event)
{QPainter painter(this);painter.translate(200,300);painter.rotate(90);painter.translate(-200,-300);painter.drawPixmap(0,0,QPixmap(":/1.jpg"));
}

8.QPixmap

  • 使用 QPainter 直接在上面进行绘制图形
  • 通过文件路径加载并显示图片.
  • 搭配 QPainter 的 drawPixmap()函数, 可以把这个图片绘制到⼀个 QLabel、QPushButton 等控件上.
  • 和系统/显示设备强相关, 不同系统/显示设备下, QPixmap 的显示可能会有所差别
Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);QPixmap pix(500,500);QPainter painter(&pix);painter.setPen(Qt::red);painter.drawEllipse(QPoint(100,100),100,100);pix.save("C:\\Users\\25713\\Desktop\\pix.png");
}

2.QImage

  • 使用QPainter 直接在上面进行绘制图形.
  • 通过文件路径加载并显示图片.
  • 能够针对图片进行像素级别的操作(操作某个指定的像素).
  • 独立于硬件的绘制系统, 能够在不同系统之上提供⼀致的显示

3.QPicture

  • 使用QPainter 直接在上面进行绘制图形.
  • 通过文件路径加载并显示图片.
  • 能够记录 QPainter 的操作步骤.
  • 独立于硬件的绘制系统, 能够在不同系统之上提供⼀致的显示

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/61190.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

阅读《基于蒙特卡洛法的破片打击无人机易损性分析》_笔记

目录 基本信息 1 引言 1.1 主要研究内容 1.2 研究必要性&#xff08;为什么要研究&#xff09; 1.3 该领域研究现状&#xff08;别人做了什么/怎么做的&#xff09; 2 主要研究过程&#xff08;我们做了什么&#xff09; 2.1 建立目标仿真模型 2.2 确定毁伤依据 2.3 无…

上海乐鑫科技一级代理商飞睿科技,ESP32-C61高性价比WiFi6芯片高性能、大容量

在当今快速发展的物联网市场中&#xff0c;无线连接技术的不断进步对智能设备的性能和能效提出了更高要求。为了满足这一需求&#xff0c;乐鑫科技推出了ESP32-C61——一款高性价比的Wi-Fi 6芯片&#xff0c;旨在为用户设备提供更出色的物联网性能&#xff0c;并满足智能设备连…

Qt Graphics View 绘图实例

Qt Graphics View 绘图实例 这个实例程序实现如下功能&#xff1a; 可以创建矩形、椭圆、三角形、梯形、直线、文字等基本图形。每个图形项都可以被选择和移动。图形项或整个视图可以缩放和旋转。图形项重叠时&#xff0c;可以调整前置或后置。多个图形项可以组合&#xff0c;…

JDK17源码系列-AbstractCollection接口源码解读

JDK17源码系列-AbstractCollection接口源码解读 1、AbstractCollection类图结构 2、AbstractCollection是实现Collection接口的顶级抽象类 3、模版方法&#xff0c;由子类实现 public abstract Iterator iterator()public abstract int size() 4、实现接口public boolean is…

深入浅出:JVM 的架构与运行机制

一、什么是JVM 1、什么是JDK、JRE、JVM JDK是 Java语言的软件开发工具包&#xff0c;也是整个java开发的核心&#xff0c;它包含了JRE和开发工具包JRE&#xff0c;Java运行环境&#xff0c;包含了JVM和Java的核心类库&#xff08;Java API&#xff09;JVM&#xff0c;Java虚拟…

任意文件读取漏洞(CVE-2024-7928)修复

验证CVE-2024-7928问题是否存在可以使用如下方法&#xff1a; https://域名/index/ajax/lang?lang..//..//目录名/文件名&#xff08;不带后缀&#xff09; 目录名是该项目的一个目录&#xff0c;这里目录位置为nginx设置站点目录为基准&#xff0c;网上两层目录。 文件名…

宠物领养系统的SpringBoot技术探索

摘 要 如今社会上各行各业&#xff0c;都在用属于自己专用的软件来进行工作&#xff0c;互联网发展到这个时候&#xff0c;人们已经发现离不开了互联网。互联网的发展&#xff0c;离不开一些新的技术&#xff0c;而新技术的产生往往是为了解决现有问题而产生的。针对于宠物领养…

2-深度学习入门(持续更新)

数据操作 1&#xff09;获取数据&#xff1b;&#xff08;2&#xff09;将数据读入计算机后对其进行处理。 n维数组&#xff0c;也称为张量&#xff08;tensor&#xff09;。 使用过Python中NumPy计算包的读者会对本部分很熟悉。 无论使用哪个深度学习框架&#xff0c;它的张…

HTML CSS JS基础考试题与答案

一、选择题&#xff08;2分/题&#xff09; 1&#xff0e;下面标签中&#xff0c;用来显示段落的标签是&#xff08; d &#xff09;。 A、<h1> B、<br /> C、<img /> D、<p> 2. 网页中的图片文件位于html文件的下一级文件夹img中&#xff0c;…

火山引擎VeDI在AI+BI领域的演进与实践

随着数字化时代的到来&#xff0c;企业对于数据分析与智能决策的需求日益增强。作为新一代企业级数据智能平台&#xff0c;火山引擎数智平台VeDI基于字节跳动多年的“数据驱动”实践经验&#xff0c;也正逐步在AI&#xff08;人工智能&#xff09;与BI&#xff08;商业智能&…

Could not locate device support files.

报错信息&#xff1a;Failure Reason: The device may be running a version of iOS (13.6.1 17G80) that is not supported by this version of Xcode.[missing string: 869a8e318f07f3e2f42e11d435502286094f76de] 问题&#xff1a;xcode15升级到xcode16之后&#xff0c;13.…

数据结构与算法(排序算法)

排序的概念 1. 排序是指将一组数据&#xff0c;按照特定的顺序进行排列的过程。 2. 这个过程通常是为了使数据更加有序&#xff0c;从而更容易进行搜索、比较或其他操作。 常见的排序算法 插入排序 1. 把待排序的记录&#xff0c;按其关键码值的大小&#xff0c;逐个插入到一…

Scala身份证上的秘密以及Map的遍历

object test {def main(args: Array[String]): Unit {val id "42032220080903332x"//1.生日是&#xff1f;//字符串截取val birthday id.substring(10,14) //不包括终点下标println(birthday)val year id.substring(6,10) //println(year)//性别&#xff1a;倒数第…

uni-app 蓝牙开发

一. 前言 Uni-App 是一个使用 Vue.js 开发&#xff08;所有&#xff09;前端应用的框架&#xff0c;能够编译到 iOS、Android、快应用以及各种小程序等多个平台。因此&#xff0c;如果你需要快速开发一款跨平台的应用&#xff0c;比如在 H5、小程序、iOS、Android 等多个平台上…

OminiControl:一个新的FLUX通用控制模型,单个模型实现图像主题控制和深度控制

之前的文章中和大家介绍过Flux团队开源了一系列工具套件&#xff0c;感兴趣的小伙伴可以点击下面链接阅读~ AI图像编辑重大升级&#xff01;FLUX.1 Tools发布&#xff0c;为创作者提供了更强大的控制能力。 OminiControl 也开源了其可控生成模型。OminiControl 是一个最小但功…

使用R的数据包快速获取、调用各种地理数据

数据一直是科学研究绕不开的话题&#xff0c;为了方便快捷的获取各种地理数据&#xff0c;许多R包被开发出来&#xff0c;今天介绍一些方便快捷的数据R包。 rnaturalearth 包使 Natural Earth 数据可用。自然地球特征包括 1&#xff1a;10m、1&#xff1a;50m 和 1&#xff1a…

如何让控件始终处于父容器的居中位置(父容器可任意改变大小)

1、改变父容器大小前 父容器是一个panel&#xff0c;控件是一个按钮button1 1&#xff09;刚开始让button1的左边距离panel的左边缘和button1的右边距离panel的右边缘两个距离相等&#xff1b; 2&#xff09;将button1的Anchor属性设置为None 2、改变父容器大小后 直接改变…

数据类型.

数据类型分类 数值类型 tinyint类型 以tinyint为例所有数值类型默认都是有符号的&#xff0c;无符号的需要在后面加unsignedtinyint的范围在-128~127之间无符号的范围在0~255之间(类比char) create database test_db; use test_db;建表时一定要跟着写上属性 mysql> creat…

[极客大挑战 2019]HardSQL--详细解析

信息搜集 登录系统&#xff0c;有两个可能的注入点&#xff1a; 随便输一下看看传参类型&#xff1a; 都是GET型。 SQL注入 传参 usernameadmin’&password123 传参 usernameadmin&password123’ username和password传参&#xff0c;四种闭合方式只有单引号报错&a…

美国发布《联邦风险和授权管理计划 (FedRAMP) 路线图 (2024-2025)》

文章目录 前言一、战略目标实施背景2010年12月&#xff0c;《改革联邦信息技术管理的25点实施计划》2011年2月&#xff0c;《联邦云计算战略》2011年12月&#xff0c;《关于“云计算环境中的信息系统安全授权”的首席信息官备忘录》2022年12月&#xff0c;《FedRAMP 授权法案》…