Как изменить цвет стиля по умолчанию для прогрессбара в Qt

Как я могу изменить зеленый оттенок в стиле QProgressbar по умолчанию, не изменяя другие градиенты и эффекты по умолчанию (немного заметный эффект «потока белого чанка»):

Стиль QProgressbar по умолчанию

.

Я пытался установить новую комбинацию цветов фона для QProgressBar :: Кусок: горизонтальный с помощью QLinearGradient, но мне не удалось сохранить упомянутый эффект ни с одной из таких таблиц стилей.

0

Решение

Возможно, попробуйте обновить StyleSheet с помощью таймера следующим образом:

mRunner = 0.1;

QTimer *mTimer = new QTimer(this);
connect(mTimer, SIGNAL(timeout()), this, SLOT(updateProgress()));
mTimer->start(40);

и метод должен изменить градиент для каждого нового шага:

void MainWindow::updateProgress()
{
QString lStyle = QString("QProgressBar::chunk {background-color: qlineargradient(x1:0, y1:0, x2:1, y2:1, stop:0 #b4b4b4, stop:%1 white, stop:1 #b4b4b4);}").arg(mRunner);
ui->progressBar->setStyleSheet(lStyle);

mRunner += 0.01;
if (mRunner > 1) {
mRunner = 0.1;
}
}
1

Другие решения

Я делаю то же самое. Сохранение белого плавного фрагмента при изменении цвета фрагмента является сложной частью. Белый плавный кусок имеет свое собственное состояние. Частично на примере Владимира, это то, что я придумал

Сначала мы создаем подкласс QProgressBar

ProgressBar.h

class AnimProgressBar : public QProgressBar
{
Q_OBJECT

private:
double cTimer = 0.9;
double mRunner = -0.2;
double gap = 0.2;
double opq = 155;
QString hue = "120";
const QString sat = "255";
QString val = "170";

public:
QString font = "";
AnimProgressBar(QWidget *parent = nullptr);

public slots:
void ForeverLoop();
void newValue(int value);
};

 

ProgressBar.cpp

AnimProgressBar::AnimProgressBar(QWidget * parent)
{
QTimer *mTimer = new QTimer(this);
connect(mTimer, SIGNAL(timeout()), this, SLOT(ForeverLoop()));
mTimer->start(50);
}

Затем мы устанавливаем изменения цвета. В этом случае я использую HSV. Каждый такт 1 + gap каждый цикл для белого плавного куска. Тактовая частота cTimer,

void AnimProgressBar::ForeverLoop()
{
QString color = hue + ", " + sat + ", " + val;

if (mRunner >= 1)
{
double num = 255 - std::fmin(255, std::fmax(0, ((1 + gap - mRunner) / gap * opq)));
QString style = font + QString("QProgressBar::chunk {background-color: qlineargradient(x1:0, y1:0, x2:1, y2:0, stop:" + QString::number(0.99995 - gap) + " hsv("+ color + "), stop:0.99995 hsv(" + color + ", " + QString::number(num) + "), stop:1 hsv(" + color + "));}");
setStyleSheet(style);
}
else if (mRunner <= 0)
{
double num = 255 - std::fmax(0, ((gap + mRunner) / gap * opq));
QString style = font + QString("QProgressBar::chunk {background-color: qlineargradient(x1:0, y1:0, x2:1, y2:0, stop:0 hsv(" + color + "), stop:0.00005 hsv("+ color + ", " + QString::number(num) + "), stop:" + QString::number(0.00005 + gap) + " hsv(" + color + "));}");
setStyleSheet(style);
}
else
{
double lower = std::fmax(0, mRunner - gap);
double higher = std::fmin(1, mRunner + gap);
QString style = font + QString("QProgressBar::chunk {background-color: qlineargradient(x1:0, y1:0, x2:1, y2:0, stop:" + QString::number(lower)
+ " hsv(" + color + "), stop:%1 hsv(" + color + ", " + QString::number(255 - opq) + "), stop:" + QString::number(higher) + " hsv(" + color + "));}").arg(mRunner);
setStyleSheet(style);
}

mRunner += cTimer;

if (mRunner > (1 + gap))
{
mRunner = 0 - gap;
}
}

Для каждого изменения значения мы изменяем hsv, разрыв и тактовую частоту

void AnimProgressBar::newValue(int value)
{

if (value <= MAX_ANIM)
{
double decivalue = value;
double power = decivalue / 100;
opq = std::fmin(155, 55 + (decivalue / 30 * 100));
gap = std::fmax(0.2, 0.9 - (decivalue / 30 * 0.7));
cTimer = 0.01 * powf(0.1, power) / 0.1;
hue = QString::number(static_cast<int>(120 - (decivalue / MAX_ANIM * 120)));
val = QString::number(static_cast<int>(170 + (decivalue / MAX_ANIM * 55)));
}

if (value == 70)
{
font = "QProgressBar { color: rgb(255, 255, 255); } ";
}

setValue(value);
setFormat(QString::number(value) + "%");
}
1

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector