2015-10-27 2 views
0

Я пытаюсь перерисовать виджет при вызове 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 
+1

Является ли ваш paintEvent переопределением, вызываемым вообще? (Используйте отладчик или qDebug для проверки). Обратите внимание, что вам не нужно использовать QImage в куче (переменная локального члена будет работать), и для этого примера здесь обычно можно просто использовать QPainter напрямую: painter.fillRect (Qt :: black, rect()); должен сделать это –

+0

Вы запускаете цикл событий? 'update' добавит событие рисования в очередь событий, поэтому ваш виджет будет перерисовываться только после возврата в цикл событий. Вместо этого вы можете попытаться называть 'repaint'. –

+0

Рефлектор paintEvent действительно называется. Да, для этого примера было бы целесообразно выполнить fillRect(), но я планирую изменить данные необработанного изображения в какой-то момент, поэтому paintevent() просто нужно перерисовать изображение. Я попробовал это с помощью repaint() и до сих пор не обновил виджет. – MateoConLechuga

ответ

0

Так получается, что я делал действительно глупую ошибку. Я забыл разместить упомянутые функции после настройки пользовательского интерфейса.

ui->setupUi(this); 
ui->LCD_widget->drawBlank(); 

Работы намного лучше. Спасибо всем за помощь!

Смежные вопросы