首页 > 解决方案 > 更改 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 位)。

标签: c++qt

解决方案


推荐阅读