0

メインウィンドウから、ペイントしようとしているラベルを持つダイアログを起動しています。

したがって、ダイアログのヘッダー ファイル (.h) には 2 つのクラスがあります。1 つはダイアログ自体用で、もう 1 つはラベル用です。したがって、私のラベルのクラスは次のとおりです。

class MyImage : public QLabel
{
    Q_OBJECT

public:
        explicit MyImage(QWidget *parent = 0);

protected:
    void paintEvent(QPaintEvent *e);
};

.cpp には、QDialog のコンストラクターと共に、MyImage クラスのコンストラクターと paintEvent 関数があります。

MyImage::MyImage(QWidget *parent)
: QLabel(parent)
{
    /*...*/
}

void MyImage::paintEvent(QPaintEvent *e)
{
    QLabel::paintEvent(e);
    QPainter painter(image_label);
    painter.setPen(QPen(QBrush(QColor(0,0,0,180)),1,Qt::DashLine));
    painter.setBrush(QBrush(QColor(255,255,255,120)));
    painter.drawRect(selectionRect);
}

これimage_labelは MyImage オブジェクトです。QDialog のコンストラクターで、QDialog のレイアウトに追加するために次のことを行います。

mainLayout->addWidget(image_label);

しかし、それはヌルです。出力 ( ) にエラー メッセージが表示されcannot add null widget、ピックスマップをプログラムに追加しようとするとimage_labelクラッシュします。

ご回答ありがとうございます。

4

1 に答える 1

0
void MyImage::paintEvent(QPaintEvent *e)
{
    // QPainter painter(image_label); <- Only paint onto yourself.
    QPainter painter(this);
    painter.setPen(QPen(QBrush(QColor(0,0,0,180)),1,Qt::DashLine));
    painter.setBrush(QBrush(QColor(255,255,255,120)));
    painter.drawRect(selectionRect);
}

出力は new によって上書きされるため、基本クラスを呼び出さないでくださいQPainterimage_labelが null であるため、クラッシュしています。

于 2012-08-16T10:47:42.247 に答える