【问题标题】:Qt4 How to draw inside a widget?Qt4 如何在小部件内绘制?
【发布时间】:2010-10-08 22:26:02
【问题描述】:

Qt4、QtCreator

我正在尝试在 Widget 内部绘图:

void Widget::on_pushButton_clicked()
{
    QPainter painter;

    painter.begin(ui->label);

    QRectF rectangle(10.0, 20.0, 80.0, 60.0);
     int startAngle = 30 * 16;
     int spanAngle = 120 * 16;
     painter.drawArc(rectangle, startAngle, spanAngle);

    painter.end();
}

但是当我按下按钮时没有任何反应。

如何正确地做到这一点?

【问题讨论】:

    标签: qt graphics qt4 qt-creator


    【解决方案1】:

    您需要覆盖paintEvent() 并在那里进行绘画。你真的不需要begin()end()。用

    声明画家
    QPainter painter(this);
    

    构造函数将处理begin(),当painter 对象超出范围并被销毁时,将调用end()

    您也不需要点击事件来触发绘画。 paintEvent() 将在小部件需要自行绘制时被调用。您可以使用按钮单击来切换一个布尔值,paintEvent() 检查以确定它是否应该显示矩形和圆弧。只需确保在切换变量后调用 update()

    void Widget::on_pushButton_clicked()
    {
        drawShapes = !drawShapes;
        update();
    }
    
    void Widget::paintEvent(QPaintEvent *)
    {
        QPainter painter(this);
    
        if(drawShapes)
        {
            QRectF rectangle(10.0, 20.0, 80.0, 60.0);
            int startAngle = 30 * 16;
            int spanAngle = 120 * 16;
            painter.drawArc(rectangle, startAngle, spanAngle);
        }
    }
    

    更新:

    为了避免覆盖小部件的paintEvent(),您可以使用QLabel 并为其分配一个像素图并对其进行绘制。注意:据我所知,每次修改时都需要设置像素图。

    void MainForm::slot_buttonClick()
    {
        QPixmap pixmap(100,100);
        pixmap.fill(QColor("transparent"));
    
        QPainter painter(&pixmap);
        painter.setBrush(QBrush(Qt::black));
        painter.drawRect(10, 10, 100, 100);
    
        label.setPixmap(pixmap);
    }
    

    【讨论】:

    • 有没有什么方法可以在不覆盖的情况下进行绘制?或者是否有任何组件可以在没有任何事件的情况下绘制,例如 TImage 或 TForm 或任何其他包含 VCL(Delphi)中 TCanvas 的组件? (在 Delphi 中,只要我需要它就可以编写 Form1.Canvas.Circle(...) ,而不仅仅是在 onpaint 事件中)
    • 我从来没有真正尝试过使用小部件外部的代码在小部件上绘图,但 QWidget 确实继承了 PaintDevice,所以它应该是可能的。
    • 从 QPainter 的文档中获取。“警告:当paintdevice 是一个小部件时,QPainter 只能在paintEvent() 函数或由paintEvent() 调用的函数中使用;那除非设置了 Qt::WA_PaintOutsidePaintEvent 小部件属性。在 Mac OS X 和 Windows 上,无论该属性的设置如何,您都只能在 paintEvent() 函数中进行绘制。"
    • 您可以使用 QLabel 和 QPixmap,在像素图上绘制并将其分配给标签。我用上面的代码添加了一个更新。
    【解决方案2】:

    如果您按照 Arnold Spence 的描述覆盖绘制方法,则应调用父级的paintEvent,否则您最终会得到一个仅在白色背景上显示矩形的小部件。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-30
      • 1970-01-01
      • 2019-10-13
      • 2014-05-10
      • 2012-09-01
      • 1970-01-01
      相关资源
      最近更新 更多