Q即使宽度和高度都为非零,也不调用ridget paint

  • 本文关键字:调用 paint ridget 高度 c++ qt
  • 更新时间 :
  • 英文 :


我正在尝试让一个滚动区域容纳一个小部件,该小部件将作为我正在尝试构建的拖放编辑器的绘图区域。然而,我似乎画不出来。

这是一张图片:https://i.stack.imgur.com/KbAaJ.png

右边的黑色空间应该是我的滚动区域

这是我的窗口类的构造函数(我使用的是QtCreator):

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,然后在widget上绘制一个绿色或红色的矩形。然而,在paintEvent开始时,cout的命令行中缺少"painting"消息,这表明它没有被执行。我最初怀疑这是因为小部件上有0宽0高。然而,构造函数中的cout告诉我小部件的位置是x=0和width=1000,因此我假设由于这与我的resize语句相匹配,所以高度也是1000,正如指定的那样。

编辑:通过调用cout.flush(),我得到了"绘画"输出。然而,这只会加深神秘感,因为绘画事件看起来并不是真正的绘画。我现在在滚动区和小部件上调用show。

有人看到我在这里做错了什么吗?也许我没有正确地将ModelEditorWidget添加到滚动区域?

顺便说一句,我对Qt很陌生,这是我第一个使用它的主要GUI项目。我的大多数其他GUI都是在C#中使用.NET完成的,但由于我希望这是跨平台的,我决定远离C#和mono,使用Qt。

QScrollArea::setWidget()的文档说明:

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

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

你试过吗?

最新更新