喷漆装置返回引擎== 0,类型:1

Paint device returned engine == 0, type: 1

本文关键字:类型 装置 返回 引擎      更新时间:2023-10-16

>我已经看到了同一个问题的很多答案,我已经通过它们,但没有一个解决了我的问题,我得到了错误

QWidget::p aintEngine:不应再被称为 QPainter::begin: 油漆装置返回引擎 == 0,类型:1 QPainter::end:画家不活动,已中止

我需要知道,什么是类型 : 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 *);  
};

图标小部件.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();
};

组小部件.cpp

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

主.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 类中做同样的事情时它不起作用,

提前致谢

你直接打电话给IconWigdet::paintEvent。这是不允许的。与其直接调用它,不如调用 QWidget::updateQWidget::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将自动安排绘画事件。

试试这个而不是你的构造函数

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

这将起作用,