c++ - 更改 QLabel 边框颜色的快速方法?
问题描述
这里是 Qt 新手。我构建了一个无框窗口,我希望它的边框随着时间的推移逐渐改变颜色。我有一个单独的“计时器”类,它作为 QThread 运行并以 20 毫秒的间隔发送信号,将新的 int a (5 < a < 250) 传递到 QMainWindow 中的插槽。这个 int 然后用于通过 setStyleSheet 更改两个背景 QLabels 的边框颜色。但是,原则上这是可行的,但是,当我尝试拖动窗口时(请注意-它是无边框的窗口-我使用 mouseEvents 处理拖动)-它变得非常滞后。它抖动很多。我 100% 确定 setStyleSheet 会大大降低应用程序的速度。计算机有足够的资源来轻松处理更多计算,但是 setStyleSheet 有一些不同之处,它只会减慢 Qt 的速度。
Qt 中更高级的人是否能够告知以下代码有什么问题,或者是否有可能以某种方式完全绕过 setStyleSheet 设置的属性以更快地获得相同的结果?如果结果更有效,我真的不介意学习编写更复杂的代码。
最小可重现代码:
更新程序.h
#ifndef UPDATER_H
#define UPDATER_H
#include <QObject>
#include <QThread>
class updater : public QObject
{
Q_OBJECT
public:
updater();
~updater();
bool isStopped;
bool isFlagged;
public slots:
void workNow();
void onExit();
signals:
void freshUpdate(int);
};
#endif // UPDATER_H
更新程序.cpp
#include "updater.h"
updater::updater()
{
isStopped = false;
isFlagged = false;
}
updater::~updater() {
}
void updater::workNow() {
int a = 250;
while (this->isStopped == false) {
if (isFlagged == false) {
a = a - 1;
emit freshUpdate(a);
} else {
a = a + 1;
emit freshUpdate(a);
}
if (a == 5 and isFlagged == false) {
isFlagged = true;
}
if (a == 250 and isFlagged == true) {
isFlagged = false;
}
QThread::msleep(20);
}
}
void updater::onExit() {
isStopped = true;
}
主窗口.h
class MainWindow: public QMainWindow
{
Q_OBJECT
QThread * T_Updater = new QThread();
updater * upt = new updater();
QPointF oldPos;
public:
MainWindow(QWidget *parent = nullptr);
~MainWindow();
private:
Ui::MainWindow*ui;
bool locked;
void mousePressEvent(QMouseEvent *event);
void mouseMoveEvent(QMouseEvent *event);
int m_nMouseClick_X_Coordinate;
int m_nMouseClick_Y_Coordinate;
public slots:
void onGuiUpdate(int value);
主窗口.cpp
MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow)
{
ui->setupUi(this);
upt->moveToThread(T_Updater);
QObject::connect(T_Updater, &QThread::started, upt, &updater::workNow);
QObject::connect(upt, &updater::freshUpdate, this, &MainWindow::onGuiUpdate);
T_Updater->start();
}
void MainWindow::mousePressEvent(QMouseEvent *event) {
m_nMouseClick_X_Coordinate = event->position().x();
m_nMouseClick_Y_Coordinate = event->position().y();
}
void MainWindow::mouseMoveEvent(QMouseEvent *event) {
move(event->globalPosition().x() - m_nMouseClick_X_Coordinate, event->globalPosition().y() - m_nMouseClick_Y_Coordinate);
}
void MainWindow::onGuiUpdate(int value) {
ui->label_40->setStyleSheet("background-color: rgb(5, 30, 5); border-style: solid; border-color: rgb(100," + QString::number(value) + ",100); border-width: 2px; border-radius: 20px;");
ui->label_42->setStyleSheet("background-color: rgb(5, 30, 5); border-style: solid; border-color: rgb(100," + QString::number(value) + ",100); border-width: 2px; border-radius: 20px;");
}
任何有助于理解为什么上面的代码会导致一个窗口在移动时非常紧张,这将非常有帮助。
以防万一这很重要:我使用 Qt Creator - Qt 6.1 - MSVC 2019(64 位)。
解决方案
推荐阅读
- oauth-2.0 - 在 Authlib 的示例 oauth2 服务器中,为什么 user_id 绑定到客户端元数据?
- mongodb - MongoDB + Postgres(或者我需要一个图形数据库吗?)
- java - org.sf.beans.factory.NoSuchBeanDefinitionException:没有可用的 X 类型的合格 bean
- c++ - c++ print Hexadecimal with int word, ostream &os
- php - 给定一个字符串,它是一系列 excel 单元格“A1:F1”,如何在 PHP 中插入这个范围?
- bash - 编辑 uniq -c (Bash) 的输出
- java - 从 Android 中的 Intent 选择时,文件返回空 ("")
- sql - 如何从 SQL 列中的日期时间值中删除时间戳
- linux - Linux shmmax 和 shmall - 如何设置正确的单位?
- elasticsearch - 部分更新到大文档