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 很陌生,这是我第一个使用它的主要 GUI 项目。我的大部分其他 GUI 内容都是使用 C# 中的 .NET 完成的,但由于我希望这是跨平台的,所以我决定远离 C#.NET 和单声道并使用 Qt。

4

1 回答 1

2

QScrollArea::setWidget() 的文档说:

如果添加小部件时滚动区域可见,则必须显式显示()它。

请注意,您必须在调用此函数之前添加小部件的布局;如果您稍后添加它,则该小部件将不可见 - 无论您何时显示()滚动区域。在这种情况下,您也不能稍后显示()小部件。

你试过吗?

于 2012-10-14T17:58:41.070 回答