C++ 绘制设备返回的引擎==0,类型:1

C++ 绘制设备返回的引擎==0,类型:1,c++,qt,qwidget,qpainter,qabstractbutton,C++,Qt,Qwidget,Qpainter,Qabstractbutton,我已经看到了同一个问题的许多答案,我已经看过了,但是没有一个解决了我的问题,我得到了错误 QWidget::paintEngine:不应再被调用 QPaint::begin:绘制设备返回的引擎==0,类型:1 QPaint::end:画师未激活,已中止 我需要知道,什么是类型:1,为什么会显示这个错误 我的代码是 iconwidget.h class IconWigdet : public QAbstractButton { Q_OBJECT QRect *iconarea; QPainter

我已经看到了同一个问题的许多答案,我已经看过了,但是没有一个解决了我的问题,我得到了错误

QWidget::paintEngine:不应再被调用 QPaint::begin:绘制设备返回的引擎==0,类型:1 QPaint::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 *);  
};
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::GroupWidget()
{ 
groupLayout->addWidget(icon, 0, 1, 1, 1, 0);
this->setLayout(groupLayout);
icon->show();
QPaintEvent *e;
icon->paintEvent(e);
}
groupwidget.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::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();
}
如果主函数改为

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
。这是不允许的。与其直接调用,不如调用或


虽然我不明白你为什么要打电话到那里。只需调用
Icon->show()应该足够了。Qt将自动安排绘制事件。

尝试此操作,而不是使用构造函数

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

这将起作用,

它不起作用。。当我在主功能中使用简单的图标->显示时,它工作正常(主功能在Qn中提到)。当我在groupwidget类中调用它时,它不起作用,实际上paint事件没有自动调用,或者当从groupwidget@AkhilVSuku您在
groupwidget.h中做了一些奇怪的事情。这是你真正的头文件吗?@AkhilVSuku你没有删除的地方到处都有不必要的指针,所以你有一大堆内存泄漏。像
QRect*iconarea
QPixmap*图标
。没有理由把它们当作指针。只有当你有充分的理由这样做时才使用指针,不要把它们放在任何地方。你的
IconWidget
构造函数也是如此,你可以传递对它的
const
引用:
IconWigdet(constqrect&rectangle,constqpixmap&tempicon)
@AkhilVSuku如果为
IconWigdet
设置最小大小会发生什么?只需输入
setMinimumSize(100100)。@AkhilVSuku将
IconWidget
添加到一个布局中,该布局将控制小部件的几何体
setGeometry
对布局中的小部件不做任何操作。在您的情况下,它似乎降到了大小
0,0
。但是,布局仍将遵循小部件的最小和最大大小。当您在
main
函数中创建
IconWidget
时,它不在布局中,因此
setGeometry
起作用。请不要进行会使您收到的答案无效的更改。我已经为你做了回卷,以便被接受的答案再次有意义。