【问题标题】:How to repaint in qt without removing the previous paint in the widget?如何在 qt 中重新绘制而不删除小部件中的先前绘制?
【发布时间】:2015-05-13 11:24:29
【问题描述】:

每次我在 QWidget 上重新绘制时,它都会重新绘制并删除之前的绘制。重绘时如何保存之前的状态?

【问题讨论】:

    标签: windows macos qt


    【解决方案1】:

    你必须明确地这样做。一种方法是在QImage 上绘制,然后在paintEvent 中简单地将内容blit 到小部件。

    一种更简单的方法是将所有图形基元存储在某种容器中,并根据需要对它们进行绘制。 Qt 提供了这样一个容器:QPicture 是一个图形元文件,用于存储图形操作以供以后重放。

    例如:

    class PicLabel : public QLabel {
      QPicture m_picture;
    public:
      PicLabel(const QString & text, QWidget * parent = 0) :
        QLabel(text, parent) {}
      PicLabel(QWidget * parent = 0) : QLabel(parent) {}
      void addPoint(const QPointF & point) {
        QPainter p(&m_picture);
        p.drawPoint(point);
        update();
      }
      void addLine(const QPointF & start, const QPointF & end) {
        QPainter p(&m_picture);
        p.drawLine(start, end);
        update();
      }
      void clear() {
        std::swap(m_picture, QPicture());
        update();
      }
    protected:
      void paintEvent(QPaintEvent * event) Q_DECL_OVERRIDE {
        QLabel::paintEvent(event);
        QPainter p(this);
        p.drawPicture(0, 0, m_picture);
      }
    };
    

    【讨论】:

    • 情况是这样的:鼠标点击Qlabel我画一个点,然后如果我再次点击第一个点被删除。我想保留他们两个。
    • @Programming 这仅适用于具有固定大小且其文本永远不会更改的标签。在这种情况下,您可以render() 标签once 进入图像,当标签首次显示时。之后每次都可以将点添加到图像上。这是一种非常复杂的方法。你不应该这样做。
    • 但是你有什么建议呢?
    • 是的,但是在我画了一个点之后,然后执行 update(),之前的点被删除了。
    • 但是有没有其他方法不保存之前的绘制区域?我认为应该有任何属性可以在不擦除以前绘制区域的情况下重新绘制......
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-19
    • 2018-09-29
    • 2012-03-28
    • 1970-01-01
    相关资源
    最近更新 更多