我已经看到了同一个问题的很多答案,我已经完成了但是没有一个解决了我的问题,我收到了错误
QWidget :: paintEngine:不应再被调用 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 *);
};
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();
}
如果main函数改为
,则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();
}
这意味着,如果我们在main函数中使用iconwidget类对象它正在工作,但是当我们在groupwidget类中执行相同操作时它不起作用,
提前致谢
答案 0 :(得分: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将自动安排油漆事件。
答案 1 :(得分:0)
尝试使用此代替构造函数
GroupWidget::GroupWidget()
{
groupLayout->addWidget(icon, 0, 1, 1, 1, 0);
this->setLayout(groupLayout);
setMinimumSize(100,100);
setMaximumSize(200,200);
icon->show();
}
这将有效,