QWidget / QPainter show()+ paintEvent() - >在旧位置显示矩形

时间:2017-02-12 22:29:30

标签: qt transparent qwidget paintevent

我必须在透明Qt窗口的不同位置显示矩形。 在显示窗口之前,我设置了新的矩形位置。有时旧位置会显示几毫秒。 (例如m_y_pos = 100而不是m_y_pos = 400)。在显示窗口和更新窗口之间似乎存在一种竞争条件。

我希望有人知道一个建议。

感谢纸浆

示例代码:

import numpy as np
import tensorflow as tf

input = np.array([[1,0,3,5,0,8,6]])

X = tf.placeholder(tf.int32,[None,7])

zeros = tf.zeros_like(X)
index = tf.not_equal(X,zeros)
loc = tf.where(index,x=X,y=X)

with tf.Session() as sess:
    out = sess.run([loc],feed_dict={X:input})
    print np.array(out)

1 个答案:

答案 0 :(得分:0)

更改位置后,您无法调用update()。通常,这应该考虑到setPos方法。

执行此操作后,不再需要hide()show():每个setPos调用都会根据需要更新小部件。

您应该从满足您需求的最基本的课程中获得:QWidget。毕竟,您并未使用QMainWindow的任何功能。

// https://github.com/KubaO/stackoverflown/tree/master/questions/rect-paint-42194052
#include <QtWidgets>

class Window : public QWidget
{
   QPointF m_pos{100, 100};
   void paintEvent(QPaintEvent* event) override
   {
      QPainter painter(this);
      painter.setBrush(Qt::red);
      painter.setPen(Qt::black);
      for (int i = 0; i < event->rect().width(); i += 50)
         painter.drawRect(QRectF(m_pos.x() + i, m_pos.y(), 30, 30));
   }
public:
   Window(QWidget *parent = nullptr) : QWidget(parent)
   {
      setAttribute(Qt::WA_NoSystemBackground, true);
      setAttribute(Qt::WA_TranslucentBackground);
      setWindowFlags(Qt::Tool | Qt::FramelessWindowHint | Qt::WindowStaysOnTopHint
                     | Qt::WindowTransparentForInput | Qt::WindowDoesNotAcceptFocus);
   }
   void setPos(const QPointF & pos) {
      m_pos = pos;
      update();
   }
};

int main(int argc, char ** argv) {
   QApplication app{argc, argv};
   Window w;
   QTimer timer;
   QObject::connect(&timer, &QTimer::timeout, [&w]{
      static bool toggle{};
      if (!w.isVisible()) {
         toggle = !toggle;
         if (toggle)
            w.setPos({200, 200});
         else
            w.setPos({100, 100});
      };
      w.setVisible(!w.isVisible());
   });
   timer.start(500);
   w.resize(1000, 500);
   return app.exec();
}