0%

QWidget

C++ Qt QWidget::setStyleSheet()函数 详解

QWidget::setStyleSheet() 是 Qt 中用于设置控件样式表的函数,它允许开发者通过样式表(类似 CSS 的语法)自定义 Qt 控件的外观和行为。以下是对该函数的详细说明:


函数定义

1
void QWidget::setStyleSheet(const QString &styleSheet);
  • 参数:
    • styleSheet 是一个包含样式表定义的字符串。
  • 功能:
    • 为控件设置或更改样式。
    • 如果传入空字符串,则清除控件的样式表。

使用方法

使用 setStyleSheet() 可以方便地修改控件的外观。以下是一些常见的使用场景:

基本用法

1
2
QPushButton *button = new QPushButton("Click Me");
button->setStyleSheet("background-color: lightblue; color: black; font-size: 18px;");

效果:
设置按钮的背景颜色为浅蓝色,文本颜色为黑色,字体大小为 18px。


设置多个属性

通过使用 ; 分隔,可以为控件设置多个样式属性:

1
2
QLabel *label = new QLabel("Hello, Qt!");
label->setStyleSheet("border: 2px solid red; background-color: yellow; color: green;");

效果:
标签的边框变为 2px 的红色实线,背景为黄色,字体颜色为绿色。


针对子控件设置样式

通过样式表可以精确指定某个子控件的样式:

1
2
QPushButton *button = new QPushButton("Button");
button->setStyleSheet("QPushButton { background-color: lightblue; } QPushButton:hover { background-color: yellow; }");

效果:
按钮默认背景颜色为浅蓝色,当鼠标悬停在按钮上时,背景颜色变为黄色。


使用类名和对象名

使用类名

可以为同一类的所有控件设置样式:

1
2
QWidget *widget = new QWidget;
widget->setStyleSheet("QLineEdit { border: 2px solid green; }");

效果:
应用到 QWidget 内的所有 QLineEdit

使用对象名

可以通过设置控件的 objectName 来定义特定控件的样式:

1
2
3
QLineEdit *lineEdit = new QLineEdit;
lineEdit->setObjectName("specialLineEdit");
lineEdit->setStyleSheet("#specialLineEdit { background-color: pink; }");

效果:
仅为名为 specialLineEdit 的输入框设置样式。


支持的样式属性

Qt 样式表支持许多类似 CSS 的属性,包括但不限于:

  • 颜色相关: color, background-color, border-color
  • 字体相关: font-size, font-family, font-style, font-weight
  • 边框相关: border, border-radius, border-width, border-style
  • 间距和大小: padding, margin, min-width, max-height

注意事项

  1. 继承性:
    • 设置在父控件上的样式可能会影响其子控件,除非明确覆盖子控件的样式。
  2. 性能影响:
    • setStyleSheet 使用样式表可能会稍微影响性能,尤其是复杂样式或频繁修改样式时。
  3. 动态更新:
    • 若要动态更新样式,确保重新调用 setStyleSheet()
  4. 调试样式:
    • 可以使用 QSS 文件来组织复杂的样式表,方便维护。

完整示例

以下是一个完整的示例,展示如何为多个控件设置不同样式:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#include <QApplication>
#include <QWidget>
#include <QPushButton>
#include <QLabel>
#include <QLineEdit>
#include <QVBoxLayout>

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

QWidget window;
window.setWindowTitle("StyleSheet Example");

QLabel *label = new QLabel("Enter your name:");
QLineEdit *lineEdit = new QLineEdit;
QPushButton *button = new QPushButton("Submit");

// 设置样式
window.setStyleSheet(
"QLabel { color: blue; font-size: 16px; }"
"QLineEdit { border: 2px solid gray; border-radius: 5px; padding: 5px; }"
"QPushButton { background-color: green; color: white; padding: 10px; border-radius: 10px; }"
"QPushButton:hover { background-color: lightgreen; }"
);

QVBoxLayout *layout = new QVBoxLayout;
layout->addWidget(label);
layout->addWidget(lineEdit);
layout->addWidget(button);
window.setLayout(layout);

window.show();
return app.exec();
}

运行效果:

  • 标签文字为蓝色,字体大小为 16px。
  • 输入框有灰色圆角边框和内边距。
  • 按钮为绿色,鼠标悬停时变为浅绿色。

通过 QWidget::setStyleSheet(),开发者可以灵活地设计现代化、美观的用户界面。

C++ Qt QWidget类 详解

在 Qt 框架中,QWidget 类是所有用户界面对象的基类。它是 GUI 编程的核心部分,几乎所有的可视化组件(如按钮、标签、窗口等)都直接或间接地继承自 QWidget。以下是对 QWidget 类的详细说明:


1. 基本概念

QWidget 提供了创建和管理用户界面的基础功能。它负责处理:

  • 绘制:管理窗口内容的绘制。
  • 事件:响应用户的输入事件(如鼠标点击、键盘输入等)。
  • 布局:安排子控件的位置和大小。
  • 窗口:管理窗口显示和属性(如标题、大小、样式等)。

2. 常用构造函数

1
QWidget(QWidget *parent = nullptr, Qt::WindowFlags f = Qt::WindowFlags());
  • 参数:

    • parent:
      • 指定父控件。
      • parentnullptr,该控件为顶层窗口。
    • f:
      • 指定窗口标志(如是否有边框、是否可调整大小等)。
  • 顶层窗口和子控件:

    • 顶层窗口:parent == nullptr
    • 子控件:parent != nullptr,会自动嵌套在父控件中。

3. 常用功能

3.1 显示与隐藏

  • 显示控件

    1
    void show();

    显示控件,控件会根据其父控件的关系自动安排位置。

  • 隐藏控件

    1
    void hide();
  • 全屏显示

    1
    void showFullScreen();
  • 最大化、最小化

    1
    2
    void showMaximized();
    void showMinimized();

3.2 设置控件属性

  • 大小和位置

    1
    void setGeometry(int x, int y, int width, int height);

    设置控件的位置和大小。

    1
    QRect geometry() const;

    获取控件的几何形状。

  • 窗口标题

    1
    2
    void setWindowTitle(const QString &title);
    QString windowTitle() const;
  • 窗口图标

    1
    2
    void setWindowIcon(const QIcon &icon);
    QIcon windowIcon() const;
  • 窗口样式

    1
    2
    void setWindowFlags(Qt::WindowFlags flags);
    Qt::WindowFlags windowFlags() const;
  • 背景颜色
    使用样式表设置背景颜色:

    1
    widget->setStyleSheet("background-color: lightblue;");

3.3 布局管理

QWidget 提供了布局机制来自动调整子控件的位置和大小。常见的布局类包括:

  • QVBoxLayout:垂直布局
  • QHBoxLayout:水平布局
  • QGridLayout:网格布局

示例:

1
2
3
QVBoxLayout *layout = new QVBoxLayout(&widget);
layout->addWidget(new QPushButton("Button 1"));
layout->addWidget(new QPushButton("Button 2"));

3.4 事件处理

  • 鼠标事件
    重写 mousePressEvent() 以处理鼠标点击:

    1
    void mousePressEvent(QMouseEvent *event) override;
  • 键盘事件
    重写 keyPressEvent() 以处理键盘按键:

    1
    void keyPressEvent(QKeyEvent *event) override;
  • 绘制事件
    使用 paintEvent() 绘制自定义内容:

    1
    void paintEvent(QPaintEvent *event) override;

示例:自定义绘制

1
2
3
4
5
void MyWidget::paintEvent(QPaintEvent *event) {
QPainter painter(this);
painter.setBrush(Qt::yellow);
painter.drawRect(rect());
}

3.5 获取控件信息

  • 获取控件尺寸

    1
    QSize size() const;
  • 获取父控件

    1
    QWidget *parentWidget() const;
  • 获取子控件

    1
    QList<QWidget *> findChildren(const QString &name = QString(), Qt::FindChildOption options = Qt::FindChildrenRecursively) const;

4. 典型示例

以下代码演示如何使用 QWidget 创建一个基本窗口,并添加一些子控件:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#include <QApplication>
#include <QWidget>
#include <QPushButton>
#include <QLabel>
#include <QVBoxLayout>

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

// 创建窗口
QWidget window;
window.setWindowTitle("QWidget Example");
window.resize(400, 300);

// 添加子控件
QLabel *label = new QLabel("Hello, Qt!", &window);
QPushButton *button = new QPushButton("Click Me", &window);

// 布局
QVBoxLayout *layout = new QVBoxLayout(&window);
layout->addWidget(label);
layout->addWidget(button);

// 显示窗口
window.show();
return app.exec();
}

运行效果:

  • 一个窗口显示“Hello, Qt!”标签和“Click Me”按钮,按钮点击时会响应默认行为。

5. 常用继承类

QWidget 是许多常用控件的基类,包括:

  • QMainWindow:主窗口类,支持菜单栏、工具栏等。
  • QDialog:对话框类。
  • QPushButtonQLabelQLineEdit 等具体控件。

6. 注意事项

  1. 父子关系:
    • 子控件的生命周期由父控件管理,不需要手动删除。
  2. 事件处理:
    • 可通过重写事件处理函数(如 paintEventmousePressEvent)来自定义行为。
  3. 性能:
    • 在复杂界面中,合理使用布局和样式表可提升性能。

通过 QWidget,可以轻松构建灵活、现代化的图形用户界面,同时还支持高度的自定义。

感谢老板支持!敬礼(^^ゞ