0%

qt_6_应用技巧

简介

  • 基于Qt5的桌面应用软件开发常见技巧

Qt 设置标签的背景颜色和透明度

在 Qt 中,可以通过多种方式设置 QLabel 的背景颜色和透明度。以下是具体方法:


1. 使用样式表 (setStyleSheet)

设置背景颜色

通过 setStyleSheet,可以使用 CSS 样式为 QLabel 设置背景颜色。

示例:

1
2
QLabel *label = new QLabel("Hello, Qt!");
label->setStyleSheet("background-color: lightblue; color: black;");

效果:

  • 标签背景为浅蓝色,文字颜色为黑色。

设置背景透明度

使用 rgbahsla 颜色值可以设置背景透明度。

示例:

1
2
QLabel *label = new QLabel("Transparent Background");
label->setStyleSheet("background-color: rgba(0, 0, 255, 0.5); color: white;");

效果:

  • 背景颜色为半透明蓝色,文字颜色为白色。

2. 使用 QPalette 设置背景颜色

QPalette 是 Qt 中管理控件颜色的类,适用于简单背景颜色的设置。

示例:

1
2
3
4
5
QLabel *label = new QLabel("Hello, Palette!");
QPalette palette = label->palette();
palette.setColor(QPalette::Window, QColor(0, 0, 255, 127)); // 设置半透明蓝色
label->setAutoFillBackground(true); // 启用背景填充
label->setPalette(palette);

效果:

  • 背景为半透明蓝色。

3. 自定义绘制 (paintEvent)

对于高度定制的背景绘制,可以重写 paintEvent 方法。

示例:

1
2
3
4
5
6
7
8
9
10
class TransparentLabel : public QLabel {
protected:
void paintEvent(QPaintEvent *event) override {
QPainter painter(this);
painter.setBrush(QBrush(QColor(0, 0, 255, 127))); // 半透明蓝色
painter.setPen(Qt::NoPen);
painter.drawRect(this->rect());
QLabel::paintEvent(event); // 绘制文字
}
};

效果:

  • 标签背景为半透明蓝色,支持自定义绘制逻辑。

4. 背景和文字透明独立处理

如果需要设置背景透明,同时保持文字完全不透明,可以使用伪类或层叠元素技术:

伪类方法

通过 ::before 添加一个透明背景层:

1
2
3
4
5
QLabel *label = new QLabel("Text with Transparent Background");
label->setStyleSheet(
"QLabel { color: black; } "
"QLabel::before { content: ''; position: absolute; top: 0; left: 0; width: 100%; height: 100%; background-color: rgba(0, 0, 255, 0.5); z-index: -1; }"
);

完整示例

以下示例演示如何结合 QLabel 和样式表设置透明背景及文本颜色:

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
#include <QApplication>
#include <QLabel>
#include <QVBoxLayout>
#include <QWidget>

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

QWidget window;
window.setWindowTitle("QLabel Background Example");
window.resize(400, 200);

QLabel *label1 = new QLabel("Opaque Background");
label1->setStyleSheet("background-color: lightblue; color: black;");

QLabel *label2 = new QLabel("Transparent Background");
label2->setStyleSheet("background-color: rgba(255, 0, 0, 0.5); color: white;");

QVBoxLayout *layout = new QVBoxLayout(&window);
layout->addWidget(label1);
layout->addWidget(label2);

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

运行效果:

  • 第一行是背景不透明的标签。
  • 第二行是带有透明背景的标签。

总结

方法 适用场景 优点
setStyleSheet 简单背景颜色和透明度设置 易于实现,语法类似 CSS
QPalette 设置单一颜色的背景 使用标准 API,易于理解
paintEvent 高度自定义背景绘制 灵活控制绘制行为
伪类或叠加元素 背景和文字透明度独立设置 背景透明但文字保持清晰

根据实际需求选择适合的方法,即可轻松实现 QLabel 的背景颜色和透明度设置!

设置子窗口显示在父窗口的位置 (绝对坐标)

  • 需求:需要在父窗体弹出消息提示框,弹出的位置是相对于父窗体的位置
  • 方法
    • 获取父窗口相对于屏幕的坐标,即绝对坐标
    • 计算子窗口的坐标
    • 移动窗口
  • 示例如下
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    void NewMainWindow::MessageAlertButtonClicked()
    {
    QLabel* label_ptr = new QLabel("this is a message alert...", this);
    label_ptr->setWindowFlags(Qt::Tool | Qt::FramelessWindowHint | Qt::WindowStaysOnTopHint);
    label_ptr->setStyleSheet("background-color: green; color: white; padding: 10px; border-radius: 5px;");
    label_ptr->setAlignment(Qt::AlignHCenter);
    label_ptr->setFixedSize(200, 50);

    QPoint global_pos = mapToGlobal(QPoint(0, 0));
    label_ptr->move(global_pos.x() + width() / 2 - label_ptr->width() / 2, global_pos.y() + 50);
    label_ptr->show();

    // 设置定时器 3 秒后关闭窗口
    QTimer::singleShot(3000, label_ptr, &QLabel::deleteLater);
    }

建立一个最简单的窗口

1
2
3
4
5
6
7
8
9
10
#include <QtWidgets>

int main(int argc,char *argv[]) //主函数入口,编译器将会从这里开始启动程序
{
QApplication a(argc,argv); //启动Qt的应用程序,相当于初始化Qt的框架
QWidget w; //QWidget类是所有用户界面对象的基类
w.resize(400,300); //设置界面宽为400像素,高为300像素
w.show(); //展示界面
return a.exec(); //程序在a的事件循环里执行
}
感谢老板支持!敬礼(^^ゞ