无法将我的Widget添加到布局中

时间:2014-02-27 21:42:43

标签: c++ qt layout

为什么我不能将我的小部件添加到布局中?它就像添加小部件的example一样...... 我的目标是绘制一个小的QWidget,其目的只是为了保持那个绘制的元素。

void Note::paintEvent(QPaintEvent *event)
{

    paintExample = new(QWidget);
    paintExample->setGeometry(500,500,500,500);
    paintExample->setStyleSheet("background:yellow");

    QImage *arrowImg = new QImage(100,100,QImage::Format_RGB32);
    QHBoxLayout *lay = new QHBoxLayout;
    lay->addWidget(arrowImg); //Error: no matching function for call to 'QHBoxLayout::addWidget(QImage*&)'
    paintExample->setLayout(lay);

    QPainter painter(arrowImg); //Must paint on QImage/QPixmap/QPicture, QWidget not possible?
    if (painter.isActive()){
        painter.begin(arrowImg);
        painter.setPen(Qt::black);
        QRect rect = QRect(50,25,60,40);
        painter.drawRect(rect);
        painter.end();
    }
    paintExample->show();
}

在私有区域的类标题中:

QWidget * paintExample;

2 个答案:

答案 0 :(得分:1)

仔细阅读文档:

  • QHBoxLayout以及任何其他布局只能保存从QLayoutItem继承的项目,这些项目是QLayout本身,QSpacerItem和QWidgetItem。创建QWidget并在其上绘画。
  • QPainter构造函数接受来自QPaintDevice的后代,QWidget就是其中之一,所以它完全有可能。

现在,还有其他问题:

  • 您可以在paintEvent()中创建无父对象而不删除它们。不仅可以经常调用这种方法,这种绘画方法根本不好。据我所知,Note已经是一个QWidget,因此您可以使用QPainter painter(this);立即在其上绘画。
  • 布局操作绝对不是要在paintEvent()中完成,也不是要显示/隐藏小部件。在其他地方这样做,例如在你的窗口/对话框构造函数中。

答案 1 :(得分:0)

  

为什么我无法将我的小部件添加到布局中?

因为QImage不是QWidget。这就是原因。您应该将图像包装在QLabel

QLabel arrowLabel;
arrowLabel.setPixmap(QPixmap::fromImage(*arrowImg));

并将其传递给布局:

lay->addWidget(arrowLabel);