我正在尝试使滚动区域包含一个小部件,该小部件将用作我正在尝试构建的拖放编辑器的绘图区域。但是,我似乎无法将其绘制出来。
这是一张图片: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。