Я пытаюсь перерисовать виджет при вызове repaint()
, но по какой-то причине он не вызывает paintevent()
. Например, когда я делаю что-то вроде этого:Qt paintevent() не срабатывает
mLCD = new LCDui();
mLCD->drawBlank();
Конструктор прекрасно работает для класса LCDui и рисует черный виджет, но когда метод drawBlank()
называется, виджет не перекрашивать. Что мне не хватает? Спасибо за помощь! Вот класс и реализация LCDui:
EDIT
Я свели к тому, что сам виджет не обновляется. Если я сделаю mLCD-> show(); Появится новое окно с правильным изображением, которое я затем смогу использовать нормально. Однако обновленный виджет не обновляется. Этот виджет был повышен до класса LCDui.
END EDIT
lcdui.cpp
#include "lcdui.h"
#include <QPainter>
#include <QPaintEvent>
#include <QRgb>
LCDui::LCDui(QWidget *parent) : QWidget(parent)
{
image = new QImage(320,240,QImage::Format_RGB32);
image->fill(qRgb(0,0,0));
}
LCDui::~LCDui()
{
delete image;
image = NULL;
}
void LCDui::paintEvent(QPaintEvent * /*event*/)
{
QPainter painter(this);
painter.drawImage(QPoint(0,0),*image);
}
void LCDui::drawBlank()
{
image->fill(qRgb(255,255,255));
this->repaint();
}
lcdui.h:
#ifndef LCDUI_H
#define LCDUI_H
#include <QWidget>
#include <QImage>
class LCDui : public QWidget
{
Q_OBJECT
public:
explicit LCDui(QWidget *parent = 0);
~LCDui();
void drawBlank();
protected:
virtual void paintEvent(QPaintEvent * /*event*/);
private:
QImage *image;
};
#endif // LCDUI_H
Является ли ваш paintEvent переопределением, вызываемым вообще? (Используйте отладчик или qDebug для проверки). Обратите внимание, что вам не нужно использовать QImage в куче (переменная локального члена будет работать), и для этого примера здесь обычно можно просто использовать QPainter напрямую: painter.fillRect (Qt :: black, rect()); должен сделать это –
Вы запускаете цикл событий? 'update' добавит событие рисования в очередь событий, поэтому ваш виджет будет перерисовываться только после возврата в цикл событий. Вместо этого вы можете попытаться называть 'repaint'. –
Рефлектор paintEvent действительно называется. Да, для этого примера было бы целесообразно выполнить fillRect(), но я планирую изменить данные необработанного изображения в какой-то момент, поэтому paintevent() просто нужно перерисовать изображение. Я попробовал это с помощью repaint() и до сих пор не обновил виджет. – MateoConLechuga