甚至在宽度和高度都不为零的情况下,即使没有调用QWidget画面?

时间:2012-10-14 17:20:07

标签: c++ qt

我正在尝试创建一个滚动区域来保存一个小部件,它将作为我正在尝试构建的拖放编辑器的绘图区域。但是,我似乎无法得到它。

这是一张图片:http://i.imgur.com/rTBjg.png

在右边,黑色空间应该是我的scrollarea

这是我的窗口类的构造函数(我正在使用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和width = 1000,所以我假设因为匹配我的resize语句,高度也是指定的1000.

编辑:通过调用cout.flush(),我获得了“绘画”输出。然而,这只会加深神秘感,因为油漆事件看起来并不像它实际上是在绘画。我现在也在滚动区域和小部件上调用show。

有谁看到我在这里做错了什么?也许我没有正确地将ModelEditorWidget添加到scrollarea?

顺便说一下,我是Qt的新手,这是我第一个使用它的主要GUI项目。我的大多数其他GUI内容都是使用C#中的.NET内容完成的,但由于我希望这是跨平台的,所以我决定远离C#.NET和单声道并使用Qt。

1 个答案:

答案 0 :(得分:2)

QScrollArea :: setWidget()的文档说:

  

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

     

请注意,您必须在调用之前添加窗口小部件   功能;如果你以后添加它,小部件将不可见 -   无论何时显示()滚动区域。在这种情况下,你可以   也不会稍后显示()小部件。

你试过吗?