0

作成しようとしているドラッグ アンド ドロップ エディターの描画領域として機能するウィジェットをスクロール領域に保持しようとしています。しかし、私はそれを描くことができないようです。

ここに写真があります:http://i.imgur.com/rTBjg.png

右側の黒いスペースは、私のスクロールエリアになるはずのものです

これが私のウィンドウクラスのコンストラクターです(私はQt-Creatorを使用しています):

ModelWindow::ModelWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::ModelWindow)
{
    ui->setupUi(this);

    editor = new ModelEditorWidget(this);

    ui->scrollArea->setWidget(editor);
}

モデル エディター ウィジェットは次のようになります。

//header

class ModelEditorWidget : public QWidget
{
    Q_OBJECT
public:
    explicit ModelEditorWidget(QWidget *parent = 0);

signals:

public slots:

protected:
    virtual void paintEvent(QPaintEvent *e);

};

//.cpp file:

ModelEditorWidget::ModelEditorWidget(QWidget *parent) :
    QWidget(parent)
{
    this->setAcceptDrops(true);

    this->resize(1000, 1000);

    cout << this->rect().x() << " " << this->rect().width() << endl;

    this->update();
}

void ModelEditorWidget::paintEvent(QPaintEvent *e)
{
    cout << "painting";

    QWidget::paintEvent(e);

    QPainter painter(this);

    painter.setBrush(QBrush(Qt::green));
    painter.setPen(QPen(Qt::red));
    painter.drawRect(400, 400, 50, 50);
    painter.fillRect(e->rect(), Qt::SolidPattern);
}

これにより、modeleditorwidget のサイズが 1000x1000 に設定され、ウィジェットに緑または赤の長方形が描画されると思います。ただし、paintEvent の先頭にある cout からのコマンド ラインに「ペイント」メッセージがないことは、それが実行されていないことを示しています。これは、ウィジェットの幅が 0 で高さが 0 だったためだと最初に疑っていました。ただし、コンストラクターの cout は、ウィジェットが x = 0 および幅 = 1000 に配置されていることを示しているため、サイズ変更ステートメントと一致するため、指定された高さも 1000 であると想定します。

編集:呼び出すcout.flush()ことで、「絵画」出力が得られました。ただし、ペイント イベントは実際にペイントしているようには見えないため、謎が深まるだけです。現在、スクロール領域とウィジェットの両方で show を呼び出しています。

ここで私が間違っている可能性があることを誰かが見ていますか? おそらく、ModelEditorWidget をスクロールエリアに適切に追加していないのでしょうか?

ところで、私は Qt に非常に慣れていません。これは、Qt を使用した最初の主要な GUI プロジェクトです。他のほとんどの GUI は C# で .NET を使用して作成しましたが、これをクロス プラットフォームにしたいので、C#.NET と mono から離れて Qt を使用することにしました。

4

1 に答える 1

2

QScrollArea::setWidget() のドキュメントは次のように述べています。

ウィジェットが追加されたときにスクロール領域が表示されている場合は、明示的に show() する必要があります。

この関数を呼び出す前に、ウィジェットのレイアウトを追加する必要があることに注意してください。後で追加すると、いつスクロール領域を表示しても、ウィジェットは表示されません。この場合、後でウィジェットを表示することもできません。

あなたはそれを試しましたか?

于 2012-10-14T17:58:41.070 に答える