1

同じ質問に対して多くの回答を見てきました。すでにそれらを確認しましたが、問題を解決したものはありません。エラーが発生しています

QWidget::paintEngine: もう呼び出されるべきではありません QPainter::begin: ペイント デバイスがエンジンを返しました == 0、タイプ: 1 QPainter::end: Painter がアクティブではなく、中止されました

type : 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();
};

グループウィジェット.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 クラスで同じことを行うと機能しません。

前もって感謝します

4

2 に答える 2

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 は自動的にペイント イベントをスケジュールします。

于 2014-12-09T13:38:18.597 に答える
0

コンストラクターの代わりにこれを試してください

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

これはうまくいきます、

于 2015-02-14T06:22:30.070 に答える