QSS 自定义QPushButton

简述

本文将通过简单示例介绍QPushButton样式如何自定义。

常用属性、子控件和伪状态

QPushButton常用属性如下:

  • border
  • border-radius
  • margin
  • padding
  • background
  • color
  • font
  • border-image
    其中有些属性可细分,如border-color、border-width、border-top、border-top-color、border-top-width、border-top-radius;margin-top;padding-top等等,可根据需要进行多样化定制。
    属性分类,请参考QSS系列:属性类型集合

QPushButton子控件如下:

QPushButton常用伪状态如下:

QPushButton支持伪状态链,比如:

  • pressed:checked
  • hover:unchecked

效果图

简单定义QPushButton在Normal、Checked、Disabled、有菜单状态和有图片下的样式。
在这里插入图片描述

QSS

如何使用样式表,请参考QSS系列:设置样式表

* {
	outline: none; /* 去掉有焦点时的虚线 */
}

QDialog {
	background: #D6DBE9; /* 对话框背景色 */
}

QPushButton {
	border: 1px solid #298DFF; /* QPushButton边框的宽度、样式和颜色 */
	border-radius: 3px; /* 边框圆角 */
	background-color: #F2F2F2; /* 背景颜色 */
	color: #298DFF; /* 文本颜色 */
	font-family: "Microsoft YaHei"; /* 文本字体族 */
	font-size: 10pt; /* 文本字体大小 */
}

QPushButton:hover {	/* 鼠标悬浮在QPushButton上时的状态 */
	background-color: #298DFF;
	color: #F2F2F2;
}

QPushButton:checked { /* QPushButton可选中时的状态 */
	border: 1px solid #FF5242;
	background-color: #F2F2F2;
	color: #FF5242;
}

QPushButton:pressed { /* 鼠标按压在QPushButton上时的状态 */
	background-color: #257FE6;
}

QPushButton:checked:pressed { /* QPushButton处于可选中且鼠标按压在QPushButton上时的状态 */
	background-color: #F2F2F2;
}

QPushButton:disabled { /* QPushButton禁用时的状态 */
	border: 1px solid #CDCDCD;
	background-color: #CDCDCD;
	color: #B4B4B4;
}

QPushButton#ImageButton { /* 定义图片按钮,ImageButton为对象名,在QSS中为特定对象定制样式 */
	border-image: url(":/Resource/border_image"); /* 使用border-image可以自适应按钮大小 */
	background-color: transparent; /* 不需要背景时可设为透明 */
}

QPushButton#ImageButton:hover {
	border-image: url(":/Resource/border_image_hover");
}

QPushButton#ImageButton:pressed {
	border-image: url(":/Resource/border_image");
}

QPushButton:menu-indicator { /* QPushButton带有菜单时的菜单指示器 */
	subcontrol-origin:padding; /* 菜单指示器的起始点 */
	subcontrol-position: center right; /* 菜单指示器的位置,处于水平靠右且垂直居中 */
	image: url(:/Resource/down_arrow_normal); /* 菜单指示器的图像 */
}

QPushButton:menu-indicator:hover, QPushButton:menu-indicator:open { /* 鼠标悬浮在菜单指示器上和菜单指示器启用时的状态 */
	position: relative;
	top: 2px;
	left: 2px;
	image: url(:/Resource/down_arrow_hover);
}

QMenu { /* 简单定义菜单样式 */
	border: 1px solid gray;
	border-radius: 3px;
	background-color: #F2F2F2;
}

QMenu::item { /* 菜单项的样式 */
	padding: 0px 0px 0px 40px;
	border: 0px solid transparent;
	background-color: transparent;
	color: #298DFF;
	min-width: 108px; /* 菜单项最小宽度,108+40+1*2=150,使得菜单宽度和QPushButton宽度保持一致 */
	min-height: 30px; /* 菜单项的最小高度 */
}

QMenu::item:selected { /* 菜单项处于选中时的状态 */
	background-color: #298DFF;
	color: #F2F2F2;
}

源码

  • main.cpp
#include "MainWindow.h"
#include <QtWidgets/QApplication>
#include <QFile>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

	//全局加载样式表
	QFile styleFile(":/Resource/DefaultTheme");
	if (styleFile.open(QIODevice::ReadOnly))
	{
		QString string = styleFile.readAll();
		qApp->setStyleSheet(string);
	}

    MainWindow w;
    w.show();
    return a.exec();
}
  • QCustomMenu.h、QCustomMenu.cpp
#ifndef QCUSTOMMENU_H
#define QCUSTOMMENU_H

#include <QMenu>

class QCustomMenu : public QMenu
{
	Q_OBJECT

public:
	explicit QCustomMenu(QWidget *parent = nullptr);
	~QCustomMenu();
};

#endif
#include "QCustomMenu.h"

QCustomMenu::QCustomMenu(QWidget *parent)
	: QMenu(parent)
{
	//自定义QMenu
	//取消边框和阴影
	this->setWindowFlags(Qt::Popup | Qt::FramelessWindowHint | Qt::NoDropShadowWindowHint);
	this->setAttribute(Qt::WA_TranslucentBackground);
}

QCustomMenu::~QCustomMenu()
{
}
  • MainWindow.h、MainWindow.cpp
#ifndef MainWindow_H
#define MainWindow_H

#include <QDialog>
#include <QPushButton>
#include "QCustomMenu.h"

class MainWindow : public QDialog
{
	Q_OBJECT

public:
	MainWindow(QWidget *parent = Q_NULLPTR);

private:
	void Init();

private slots:
	void OnCheckedButtonClicked(bool checked);

private:
	QPushButton *m_pNormalButton;
	QPushButton *m_pCheckedButton;
	QPushButton *m_pDisabledButton;
	QPushButton *m_pMenuButton;
	QPushButton *m_pImageButton;
	QCustomMenu *m_pButtonMenu;
};
#endif // !MainWindow_H
#include "MainWindow.h"

#include <QBoxLayout>

MainWindow::MainWindow(QWidget *parent)
    : QDialog(parent)
{
	Init();
}

void MainWindow::Init()
{
	//Normal QPushButton
	m_pNormalButton = new QPushButton("Normal", this);
	m_pNormalButton->setFixedSize(150, 40);

	//Checked QPushButton
	m_pCheckedButton = new QPushButton("Unchecked", this);
	m_pCheckedButton->setFixedSize(150, 40);
	m_pCheckedButton->setCheckable(true);
	m_pCheckedButton->setChecked(false);
	connect(m_pCheckedButton, SIGNAL(clicked(bool)), this, SLOT(OnCheckedButtonClicked(bool)));

	//Disabled QPushButton
	m_pDisabledButton = new QPushButton("Disabled", this);
	m_pDisabledButton->setFixedSize(150, 40);
	m_pDisabledButton->setEnabled(false);

	//Menu QPushButton
	m_pMenuButton = new QPushButton("Menu", this);
	m_pMenuButton->setFixedSize(150, 40);
	
	//使用自定义菜单
	m_pButtonMenu = new QCustomMenu(this);
	m_pButtonMenu->addAction("OK");
	m_pButtonMenu->addAction("CANCEL");
	m_pMenuButton->setMenu(m_pButtonMenu);

	//图片按钮
	m_pImageButton = new QPushButton(this);
	m_pImageButton->setObjectName("ImageButton"); //设定对象名,可在QSS中为此图片按钮定制专属样式
	m_pImageButton->setFixedSize(73, 73);
	
	//垂直布局
	QVBoxLayout *pLayout = new QVBoxLayout;
	pLayout->addWidget(m_pNormalButton, 1, Qt::AlignHCenter);
	pLayout->addWidget(m_pCheckedButton, 1, Qt::AlignHCenter);
	pLayout->addWidget(m_pDisabledButton, 1, Qt::AlignHCenter);
	pLayout->addWidget(m_pMenuButton, 1, Qt::AlignHCenter);
	pLayout->addWidget(m_pImageButton, 1, Qt::AlignHCenter);
	pLayout->setSpacing(10);
	pLayout->setContentsMargins(10, 10, 10, 10);

	this->setLayout(pLayout); //设置布局
	this->setMinimumSize(600, 500); //设定最小大小
}

void MainWindow::OnCheckedButtonClicked(bool checked)
{
	//改Checked QPushButton的文本
	if (checked)
	{
		m_pCheckedButton->setText("Checked");
	}
	else
	{
		m_pCheckedButton->setText("Unchecked");
	}
}

参考

参考Qt助手,如有错误,请指正,谢谢!

### 回答1: 在 qss 中设置自定义属性的方法如下: 1. 在 qss 文件中添加自定义属性的声明,例如: ``` QPushButton[customAttribute="value"] { /* Style rules go here */ } ``` 2. 在代码中为控件设置自定义属性,例如: ``` pushButton->setProperty("customAttribute", "value"); ``` 3. 在代码中应用 qss 样式表,例如: ``` pushButton->setStyleSheet(styleSheet); ``` 注意:自定义属性的名称必须以 "q_" 或 "Q_" 开头,否则无法在 qss 中使用。 ### 回答2: 在使用Qt编程时,可以使用QSS(Qt Style Sheets)来设置控件的样式和外观。要给控件设置自定义属性,可以按照以下步骤操作: 首先,在代码中创建一个派生自QWidget或其子类的自定义控件,例如MyWidget。 然后,在MyWidget类的头文件中定义一个成员变量作为自定义属性,例如myProperty。 接下来,在MyWidget类的实现文件中提供一个getter和setter方法来访问和修改这个自定义属性。 再次,在QSS中使用选择器来选择需要设置自定义属性的控件,例如具有自定义属性的MyWidget实例,可以通过选择器“MyWidget[myProperty="value"]”来选择。 最后,在QSS中使用属性设置语法来设置自定义属性的值。例如,可以通过设置“myProperty: value;”来给控件设置自定义属性的值。 总结起来,要在QSS内给控件设置自定义属性,需要在代码中定义自定义控件,提供getter和setter方法来访问和修改自定义属性,然后在QSS中使用选择器和属性设置语法来设置自定义属性的值。这样在QSS中就可以通过选择器选择具有自定义属性的控件,并为它们设置相应的样式。 ### 回答3: 在Qt中,可以通过在QSS样式表内定义自定义属性来给控件设置自定义属性。下面是一个实现的示例: 首先,在Qt设计师中设计界面并添加一个控件,例如QPushButton。然后,选择该控件,右键单击选择"Go to slot...",选择"clicked()"信号的槽函数。 在生成的槽函数内,可以通过setProperty()函数给控件设置自定义属性。例如,设置一个自定义属性"myProperty"为"myValue": ```cpp void MainWindow::on_pushButton_clicked() { ui->pushButton->setProperty("myProperty", "myValue"); } ``` 接下来,在QSS样式表中,可以通过"["和"]"操作符定义自定义属性的样式。例如,设置属性"myProperty"为"myValue"的背景颜色为红色: ```qss QPushButton[myProperty="myValue"] { background-color: red; } ``` 将以上样式表应用到控件上,即可使设置了自定义属性的控件显示红色背景。 需要注意的是,自定义属性的类型只能是字符串。如果要设置其他类型的属性,可以使用 QVariant 类型进行转换。 总结来说,通过在槽函数内使用 setProperty() 方法给控件设置自定义属性,然后在样式表中使用设置的属性值来定义样式,就可以实现在 QSS 内给控件设置自定义属性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值