我必须在透明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)
答案 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();
}