QPainter fillRect над геометрией виджета в ячейке сетки

Я пошел о настройке QPushButton виджет такой, что при нажатии появляется видимая белая вспышка над виджетом. Это прекрасно работает для кнопки, которую я нашел в ячейке (0, 0) моей сетки. Что касается моей кнопки, расположенной в (2, 0), то кажется, что она вообще не рисует прямоугольник. Это поведение можно увидеть в этом видео, которое я загрузил, с соответствующим qDebug вывод (название кнопки & геометрия). При нажатии вспышка появляется над «Registry», но не «Exit»:
https://youtu.be/j5gE_5jeMtg

Теперь о коде (если вы видите что-то, что можно оптимизировать, пожалуйста, не стесняйтесь дать мне несколько советов):

pushbutton.h

#ifndef PUSHBUTTON
#define PUSHBUTTON

#include <QtCore>
#include <QPushButton>
#include <QPainter>

class PushButton : public QPushButton
{
Q_OBJECT

public:
explicit PushButton(QString text, QWidget *parent = 0);

protected:
virtual void paintEvent(QPaintEvent *);

public slots:
void OnClick();
void OnTick();

private:
enum States
{
NONE = 0,
RESET,
DRAW
} state = NONE;

QTimer *timer;

float delta = 0.0f;
};

#endif

pushbutton.cpp

#include "pushbutton.h"
PushButton::PushButton(QString text, QWidget *parent) : QPushButton(text, parent)
{
timer = new QTimer(this);

QObject::connect(this, SIGNAL(clicked(bool)), this, SLOT(OnClick()));
QObject::connect(timer, SIGNAL(timeout()), this, SLOT(OnTick()));
}

void PushButton::paintEvent(QPaintEvent *e)
{
QPushButton::paintEvent(e);

if(state == States::NONE)
{
return;
}

QPainter painter(this);

if(state == States::RESET)
{
state = States::NONE;

painter.eraseRect(geometry());

update();
}
else
{
painter.fillRect(geometry(), QColor(200, 200, 200, 200 * (delta < 1.0f ? delta : 2.0f - delta)));
}
}

void PushButton::OnClick()
{
qDebug() << text() << geometry();

state = States::DRAW;

delta = 0.0f;

timer->start(20);
}

void PushButton::OnTick()
{
delta += 0.2f;

if(delta > 2.0f)
{
state = States::RESET;

timer->stop();
}

update();
}

mainwindow.cpp

MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow)
{
ui->setupUi(this);

registryButton = new PushButton("Registry");
exitButton = new PushButton("Exit");

registryButton->setStyleSheet("* { font-size: 16pt; font-family: Segoe360;""border: none;""color: rgba(240, 240, 240, 255);""background: qlineargradient(x1:0 y1:0, x2:0 y2:1, stop:0 rgba(160, 169, 212, 255), stop:1 rgba(137, 151, 216, 255)); }");

exitButton->setStyleSheet("* { font-size: 16pt; font-family: Segoe360;""border: none;""color: rgba(240, 240, 240, 255);""background: qlineargradient(x1:0 y1:0, x2:0 y2:1, stop:0 rgba(191, 78, 78, 255), stop:1 rgba(199, 53, 53, 255)); }");

ui->gridLayout->addWidget(registryButton, 0, 0, Qt::AlignTop);
ui->gridLayout->addWidget(exitButton, 2, 0, Qt::AlignBottom);
}

Мое единственное предположение в отношении такого поведения состоит в том, что с сетками можно работать больше, чем я знаю.

1

Решение

Проверьте разницу между geometry() а также e->rect(), Работает с e->rect(),

qDebug() << "paint" << text() << geometry() << e->rect();
painter.fillRect(e->rect(), QColor(200, 200, 200, 200 * (delta < 1.0f ? delta : 2.0f - delta)));

Выход:

paint "Registry" QRect(0,0 381x24) QRect(0,0 381x24)
paint "Exit" QRect(0,217 381x24) QRect(0,0 381x24)

QPaintEvent::rect():
Возвращает прямоугольник, который необходимо обновить.

QWidget::geometry(): Это свойство содержит геометрию виджета относительно его родителя и исключает рамку окна.

1

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

Других решений пока нет …

По вопросам рекламы [email protected]