Устройство рисования вернуло двигатель == 0, тип: 1

Я видел много ответов на один и тот же вопрос, я уже прошел через них, но ни один из них не решил мою проблему, я получаю сообщение об ошибке

QWidget::paintEngine: больше не следует вызывать QPainter::begin: Устройство рисования вернуло engine == 0, тип: 1 QPainter::end: Painter не активен, прерван

Мне нужно знать, что такое тип: 1 и почему отображается эта ошибка,

Мой код

iconwidget.h

class IconWigdet : public QAbstractButton
{
Q_OBJECT
QRect *iconarea;
QPainter p;
QPixmap *icon; 
public:
explicit IconWigdet(QRect *rectangle,QPixmap *tempicon);
void paintEvent(QPaintEvent *);  
};

iconwidget.cpp

IconWigdet::IconWigdet(QRect *rectangle,QPixmap *tempicon)
{
iconarea = new QRect();
*iconarea = *rectangle  ;
icon = new QPixmap(*tempicon);
this->setGeometry(0,0,iconarea->width(),iconarea->height()+20);
}

void IconWigdet::paintEvent(QPaintEvent *)
{
qDebug() << " PaintEvent ";
p.begin(this);
p.drawText(iconarea->x()+ 10,iconarea->height()+10, "name");
p.drawPixmap ( *iconarea,*icon );
p.end();
}

groupwidget.h

class GroupWidget: public QWidget
{
Q_OBJECT
QGridLayout *groupLayout = new QGridLayout ;
QRect *rect = new QRect( 0, 0, 100, 100);
QPixmap *pimap = new QPixmap("../widgeticon/icons/ball.png");
IconWigdet *icon = new IconWigdet(rect,pimap);
public:
GroupWidget();
};

groupwidget.cpp

GroupWidget::GroupWidget()
{ 
groupLayout->addWidget(icon, 0, 1, 1, 1, 0);
this->setLayout(groupLayout);
icon->show();
QPaintEvent *e;
icon->paintEvent(e);
}

main.cpp

int main(int argc, char *argv[])
{
QApplication a(argc, argv);
GroupWidget *Gw = new GroupWidget;
Gw->show();
return a.exec();
}

и класс iconwidget будет отлично работать, если основная функция изменится на

int main(int argc, char *argv[])
{
QApplication a(argc, argv);;   
QRect *rect = new QRect( 0, 0, 100, 100);
QPixmap *pimap = new QPixmap("../widgeticon/icons/ball.png");
IconWigdet *Iw = new IconWigdet(rect,pimap);
Iw->show();
return a.exec();
}

это означает, что если мы используем объект класса iconwidget в основной функции, он работает, но не работает, когда мы делаем то же самое в классе groupwidget,

заранее спасибо


person Akhil V Suku    schedule 09.12.2014    source источник
comment
Пожалуйста, не вносите изменения, которые делают полученные ответы недействительными. Я откатился для вас, чтобы принятый ответ снова имел смысл.   -  person Toby Speight    schedule 19.10.2018


Ответы (2)


Вы звоните IconWigdet::paintEvent напрямую. Это не разрешено. Вместо того, чтобы вызывать его напрямую, вызовите QWidget::update или QWidget::repaint.

GroupWidget::GroupWidget()
{ 
    groupLayout->addWidget(icon, 0, 1, 1, 1, 0);
    this->setLayout(groupLayout);
    icon->show();
    // QPaintEvent *e;
    // icon->paintEvent(e); this is not allowed
    icon->update(); // do this instead
}

Хотя я не понимаю, зачем вам что-то там называть. Просто позвонить Icon->show(); должно быть достаточно. Qt автоматически запланирует событие рисования.

person thuga    schedule 09.12.2014
comment
Это не работает.. это работает, когда я просто использую Icon-›show в основной функции (основная функция упоминается в Qn). Это не работает, когда я вызываю его в классе groupwidget, на самом деле событие рисования не вызывается автоматически или показывает ошибку при вызове из groupwidget - person Akhil V Suku; 09.12.2014
comment
@AkhilVSuku Ты делаешь что-то странное в своем groupwidget.h. Это ваш настоящий заголовочный файл? - person thuga; 10.12.2014
comment
@AkhilVSuku У вас также есть ненужные указатели повсюду, которые вы не удаляете, поэтому у вас есть куча утечек памяти. Как QRect *iconarea и QPixmap *icon. Нет причин использовать их в качестве указателей. Используйте указатели только в том случае, если у вас есть для этого веская причина, не размещайте их повсюду. То же самое касается вашего конструктора IconWidget, вы можете передать ему const ссылки: IconWigdet(const QRect &rectangle, const QPixmap &tempicon); - person thuga; 10.12.2014
comment
groupwidget.h — это тот же файл, который я использую. Я сомневаюсь, почему paintEvent не работает, когда я создаю объект в классе groupwidget, в то время как он работает, когда я создаю объект в основной функции. заранее Спасибо за вашу помощь, - person Akhil V Suku; 10.12.2014
comment
@AkhilVSuku Что произойдет, если вы установите минимальный размер для своего IconWigdet? Просто поместите setMinimumSize(100,100); в конструктор. - person thuga; 10.12.2014
comment
Это работает, спасибо, но не могли бы вы объяснить, почему это не работало в другом случае, почему мне нужно указать setMinimumSize(100,100); в groupwidget (в этом случае объект groupwidget вызывается в основной функции для show) , а в основной функции это не требуется - person Akhil V Suku; 10.12.2014
comment
@AkhilVSuku Вы добавляете свой IconWidget в макет, который будет контролировать геометрию виджета. setGeometry ничего не делает для виджетов внутри макета. В вашем случае кажется, что он уменьшился до размера 0,0. Однако макет по-прежнему будет учитывать минимальный и максимальный размер виджета. Когда вы создали свой IconWidget в функции main, его не было в макете, поэтому setGeometry работало. - person thuga; 10.12.2014
comment
Я, вот почему это не работает, теперь я понял ошибку, которую я сделал, спасибо - person Akhil V Suku; 10.12.2014

Попробуйте это вместо вашего конструктора

GroupWidget::GroupWidget()
{ 
    groupLayout->addWidget(icon, 0, 1, 1, 1, 0);
    this->setLayout(groupLayout);
    setMinimumSize(100,100); 
    setMaximumSize(200,200); 
    icon->show();
}

Это сработает,

person Community    schedule 14.02.2015