0%

QLabel

QLabel::setFixedSize() 详解

QLabel::setFixedSize()QWidget 类提供的方法,用于设置窗口或控件的固定大小,使其无法通过用户操作或布局管理器改变大小。


方法定义

1
2
void QWidget::setFixedSize(const QSize &size);
void QWidget::setFixedSize(int width, int height);
  • size:通过 QSize 对象指定宽度和高度。
  • widthheight:直接指定宽度和高度的整数值。

一旦调用了 setFixedSize(),控件或窗口的大小将固定,无法被用户拖动调整,也不会响应布局管理器的尺寸更改。


使用场景

  1. 固定控件大小
    • 某些控件需要保持固定大小,例如按钮、图标等。
  2. 弹窗或对话框
    • 创建不可调整大小的窗口或对话框。
  3. 自定义 UI
    • 精确控制控件的尺寸,不受布局管理器影响。

基本用法

1. 设置固定大小

1
2
3
4
QLabel *label = new QLabel("固定大小的 QLabel");
label->setFixedSize(200, 100); // 宽 200px,高 100px
label->setStyleSheet("background-color: lightblue;");
label->show();

2. 使用 QSize 对象

1
2
3
4
QLabel *label = new QLabel("使用 QSize 设置固定大小");
label->setFixedSize(QSize(300, 150)); // 宽 300px,高 150px
label->setStyleSheet("background-color: lightgreen;");
label->show();

与其他方法的区别

方法 功能
resize(int, int) 设置控件的当前大小,但大小可能会被用户调整或布局管理器覆盖。
setMinimumSize(int, int) 设置控件的最小大小,允许控件变大,但不能小于该值。
setMaximumSize(int, int) 设置控件的最大大小,允许控件变小,但不能大于该值。
setFixedSize() 同时设置最小大小和最大大小为相同值,从而固定控件大小,完全禁止大小变化。

示例应用

1. 创建不可调整大小的窗口

1
2
3
4
5
QLabel *label = new QLabel("这是一个固定大小的窗口");
label->setWindowFlags(Qt::Window); // 设置为独立窗口
label->setFixedSize(400, 300); // 固定窗口大小
label->setStyleSheet("background-color: lightyellow;");
label->show();

2. 创建一个图标显示区域

1
2
3
4
5
6
QLabel *iconLabel = new QLabel();
iconLabel->setFixedSize(64, 64); // 固定大小为 64x64
iconLabel->setPixmap(QPixmap(":/icons/sample_icon.png").scaled(64, 64)); // 设置图标
iconLabel->setAlignment(Qt::AlignCenter);
iconLabel->setStyleSheet("border: 1px solid gray;");
iconLabel->show();

3. 在布局中使用固定大小的控件

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

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

QWidget window;
QVBoxLayout *layout = new QVBoxLayout(&window);

QLabel *label1 = new QLabel("这是可调整大小的 QLabel");
QLabel *label2 = new QLabel("这是固定大小的 QLabel");
label2->setFixedSize(200, 50);

layout->addWidget(label1);
layout->addWidget(label2);

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

在这个示例中,label1 的大小会随着布局调整,而 label2 的大小保持固定。


注意事项

  1. 禁用大小调整

    • 调用 setFixedSize() 后,控件或窗口将禁用用户拖动调整大小的功能。
  2. 优先级高于布局管理器

    • 如果控件位于布局中,setFixedSize() 会覆盖布局管理器对控件大小的设置。
  3. 跨平台行为一致

    • setFixedSize() 在不同平台上表现一致,无需担心平台差异。
  4. setMinimumSizesetMaximumSize 的关系

    • 调用 setFixedSize() 会同时设置最小和最大大小为同一个值,相当于调用了:
      1
      2
      widget->setMinimumSize(width, height);
      widget->setMaximumSize(width, height);

通过 setFixedSize(),可以精确控制窗口或控件的大小,适用于需要固定尺寸的场景,例如弹窗、按钮、图标区域等,是构建稳定用户界面布局的重要工具。

QLabel::setWindowFlags() 详解

QLabel::setWindowFlags() 是用于设置 QLabel 窗口标志的方法,继承自 QWidget。窗口标志(Qt::WindowFlags)定义了窗口的外观和行为特性,例如是否有边框、标题栏、是否是工具窗口等。


方法定义

1
void QLabel::setWindowFlags(Qt::WindowFlags flags);
  • flags 是一个 Qt::WindowFlags 类型,可以通过 | 运算符组合多个标志。
  • 设置了特定标志后,会改变 QLabel 的窗口特性,比如是否显示为独立窗口、是否无边框、是否置顶等。

常见的 Qt::WindowFlags

以下是常用的窗口标志及其作用:

标志名称 说明
Qt::Widget 默认值,表示普通窗口部件。
Qt::Window QLabel 转换为顶层窗口,显示为独立窗口。
Qt::Dialog QLabel 转换为对话框窗口(类似模态对话框)。
Qt::Tool 工具窗口,通常是小窗口,不会在任务栏显示,并总是置顶父窗口之上。
Qt::FramelessWindowHint 无边框窗口,不带标题栏和边框。
Qt::WindowStaysOnTopHint 窗口总是保持在其他窗口的上方。
Qt::WindowStaysOnBottomHint 窗口总是保持在其他窗口的下方。
Qt::CustomizeWindowHint 自定义窗口标志,必须手动添加需要的功能(如标题栏)。
Qt::SplashScreen 用于启动画面窗口。
Qt::SubWindow 作为子窗口嵌套在父窗口中。
Qt::Popup 弹出窗口,常用于右键菜单或选择框。
Qt::WindowCloseButtonHint 显示关闭按钮(标题栏需要 Qt::Window 或相关标志)。

用法示例

1. 普通窗口

QLabel 默认是作为子窗口(Qt::Widget)存在的。如果需要显示为独立窗口,可以设置为 Qt::Window

1
2
3
QLabel *label = new QLabel("这是一个普通窗口");
label->setWindowFlags(Qt::Window);
label->show();

2. 无边框窗口

可以移除标题栏和边框,用于自定义窗口或提示框。

1
2
3
4
QLabel *label = new QLabel("无边框窗口");
label->setWindowFlags(Qt::FramelessWindowHint);
label->setStyleSheet("background-color: lightblue; padding: 10px;");
label->show();

3. 工具窗口

将窗口设置为工具窗口,使其成为一个小型的、总是置顶的辅助窗口。

1
2
3
4
QLabel *label = new QLabel("工具窗口");
label->setWindowFlags(Qt::Tool | Qt::WindowStaysOnTopHint);
label->setStyleSheet("background-color: lightgreen; padding: 10px;");
label->show();

4. 自定义标题栏窗口

使用 Qt::CustomizeWindowHint 自定义窗口功能。

1
2
3
QLabel *label = new QLabel("自定义标题栏窗口");
label->setWindowFlags(Qt::Window | Qt::CustomizeWindowHint | Qt::WindowCloseButtonHint);
label->show();

5. 弹出窗口

使用 Qt::Popup 将窗口设置为弹出窗口,例如右键菜单或工具选择器。

1
2
3
4
QLabel *label = new QLabel("弹出窗口");
label->setWindowFlags(Qt::Popup);
label->setStyleSheet("background-color: yellow; padding: 10px;");
label->show();

6. 启动画面窗口

使用 Qt::SplashScreen 设置窗口为启动画面。

1
2
3
4
QLabel *label = new QLabel("启动画面");
label->setWindowFlags(Qt::SplashScreen);
label->setStyleSheet("background-color: orange; padding: 10px;");
label->show();

常见问题与注意事项

  1. 无边框后窗口无法移动

    • 无边框窗口(Qt::FramelessWindowHint)会失去默认的拖动功能,需要手动实现鼠标拖动。

    示例:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    void mousePressEvent(QMouseEvent *event) {
    if (event->button() == Qt::LeftButton) {
    dragStartPosition = event->globalPos() - frameGeometry().topLeft();
    }
    }
    void mouseMoveEvent(QMouseEvent *event) {
    if (event->buttons() & Qt::LeftButton) {
    move(event->globalPos() - dragStartPosition);
    }
    }
  2. 标志的组合

    • 窗口标志可以通过 | 运算符组合使用,但某些标志可能会互相覆盖,例如 Qt::FramelessWindowHintQt::WindowCloseButtonHint 一起使用时,关闭按钮不会显示。
  3. 父子关系影响

    • 如果设置了父窗口,窗口标志的行为可能受影响。例如,Qt::WindowStaysOnTopHint 的窗口总是置顶,但只会置顶于父窗口之上。
  4. 跨平台差异

    • 不同平台对某些窗口标志的支持可能存在差异。例如,某些 Linux 窗口管理器可能不支持 Qt::WindowStaysOnBottomHint

通过 setWindowFlags(),可以灵活控制 QLabel 的显示行为,让其满足各种场景需求,如独立窗口、无边框窗口、工具窗口等。

C++ QLabel类 详解

QLabel 是 Qt 框架中用于显示文本或图像的控件类。它是一个简单的 GUI 元素,适用于需要显示静态文本、动态文本或图像的场景。

以下是对 QLabel 类的详解:


基本功能

QLabel 的主要功能是:

  1. 显示文本(静态文本、HTML 格式文本、动态更新的文本)。
  2. 显示图片。
  3. 可作为提示信息的承载控件。
  4. 支持丰富的文本格式,包括纯文本、HTML 和样式化文本。

构造函数

1
2
QLabel(QWidget *parent = nullptr, Qt::WindowFlags f = Qt::WindowFlags());
QLabel(const QString &text, QWidget *parent = nullptr, Qt::WindowFlags f = Qt::WindowFlags());
  • 参数

    • text:初始显示的文本。
    • parent:父窗口指针。
    • f:窗口标志,通常保持默认值。
  • 示例:

    1
    QLabel *label = new QLabel("Hello, QLabel!");

常用方法

1. 设置文本

1
2
void setText(const QString &text);
QString text() const;
  • 设置或获取 QLabel 的显示文本。
  • 示例:
    1
    label->setText("New Text");

2. 设置对齐方式

1
2
void setAlignment(Qt::Alignment alignment);
Qt::Alignment alignment() const;
  • 设置文本或图片的对齐方式。
  • 示例:
    1
    label->setAlignment(Qt::AlignCenter);

3. 设置图片

1
2
void setPixmap(const QPixmap &pixmap);
QPixmap pixmap() const;
  • 设置 QLabel 显示的图片。
  • 示例:
    1
    2
    QPixmap pixmap(":/images/logo.png");
    label->setPixmap(pixmap);

4. 自动调整大小

1
2
void setScaledContents(bool scaled);
bool hasScaledContents() const;
  • 控制 QLabel 是否根据内容自动调整大小。
  • 示例:
    1
    label->setScaledContents(true);

5. 设置文本格式

  • 支持 HTML 格式的文本显示
    1
    2
    void setTextFormat(Qt::TextFormat format);
    Qt::TextFormat textFormat() const;
  • 常用格式包括 Qt::PlainTextQt::RichTextQt::AutoText
  • 示例:
    1
    label->setText("<b>Bold Text</b>");

6. 设置文本样式

1
void setStyleSheet(const QString &styleSheet);
  • 设置 QLabel 的样式表。
  • 示例:
    1
    label->setStyleSheet("color: red; font-size: 16px;");

7. 获取文本尺寸

1
QSize sizeHint() const;
  • 返回 QLabel 当前内容建议的尺寸。

8. 设置提示信息

1
void setToolTip(const QString &text);
  • 为 QLabel 设置提示信息。
  • 示例:
    1
    label->setToolTip("This is a QLabel");

9. 清除内容

1
void clear();
  • 清空 QLabel 的内容。
  • 示例:
    1
    label->clear();

信号与槽

QLabel 本身不直接提供信号,但可以通过事件或自定义逻辑配合使用。例如,结合鼠标事件使 QLabel 响应点击:

  • 重写 mousePressEvent
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    class ClickableLabel : public QLabel {
    Q_OBJECT
    public:
    explicit ClickableLabel(QWidget *parent = nullptr) : QLabel(parent) {}
    signals:
    void clicked();
    protected:
    void mousePressEvent(QMouseEvent *event) override {
    emit clicked();
    QLabel::mousePressEvent(event);
    }
    };
  • 使用自定义 clicked 信号。

QLabel 示例代码

纯文本显示

1
2
3
4
5
6
7
8
9
10
11
12
13
#include <QApplication>
#include <QLabel>

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

QLabel label("Hello, QLabel!");
label.setAlignment(Qt::AlignCenter);
label.setStyleSheet("font-size: 20px; color: blue;");
label.show();

return app.exec();
}

显示图片

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <QApplication>
#include <QLabel>
#include <QPixmap>

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

QLabel label;
QPixmap pixmap(":/images/logo.png");
label.setPixmap(pixmap);
label.setScaledContents(true); // 图片自动适应 QLabel 大小
label.resize(200, 200);
label.show();

return app.exec();
}

HTML 格式文本

1
2
3
4
5
6
7
8
9
10
11
12
13
#include <QApplication>
#include <QLabel>

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

QLabel label;
label.setText("<h1 style='color:red;'>Hello, <i>HTML</i>!</h1>");
label.setAlignment(Qt::AlignCenter);
label.show();

return app.exec();
}

QLabel 常见属性

属性 说明
text 显示的文本内容
pixmap 显示的图片
alignment 对齐方式(文本或图片)
wordWrap 是否自动换行
scaledContents 是否自动缩放内容
toolTip 鼠标悬浮提示信息

通过灵活使用 QLabel,可以满足 GUI 界面中简单的显示需求,例如展示文字、图片或动态信息。

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