투명한 Qt 윈도우에서 다른 위치에 직사각형을 표시해야합니다. 창을 표시하기 전에 새 사각형 위치를 설정합니다. 때로는 몇 밀리 초 동안 이전 위치가 표시됩니다. (예 : m_y_pos = 400 대신 m_y_pos = 100). 창을 표시하고 창을 업데이트하는 사이에는 경쟁 조건이있는 것 같습니다.QWidget/QPainter show() + paintEvent() -> 이전 위치에 사각형 표시
누군가가 제안을 알고 있기를 바랍니다.
감사 펄프
예제 코드 :
#include <QApplication>
#include <QtWidgets/QMainWindow>
#include <QPaintEvent>
#include <QTimer>
#include <QDebug>
#include <QPainter>
class QtGuiApplication : public QMainWindow
{
Q_OBJECT
public:
int m_x_pos;
int m_y_pos;
QTimer* m_timer;
QtGuiApplication(QWidget *parent = Q_NULLPTR) : QMainWindow(parent), m_x_pos(100), m_y_pos(100)
{
setGeometry(100, 100, 1000, 1000);
//Make Window transparent
setAttribute(Qt::WA_NoSystemBackground, true);
setAttribute(Qt::WA_TranslucentBackground);
setWindowFlags(Qt::Tool | Qt::FramelessWindowHint | Qt::WindowStaysOnTopHint | Qt::WindowTransparentForInput | Qt::WindowDoesNotAcceptFocus);
m_timer = new QTimer(this);
m_timer->setInterval(500);
m_timer->start();
connect(m_timer, &QTimer::timeout, this, &QtGuiApplication::Tick);
}
private slots:
//toggle visibility of the window to show the effect
void Tick()
{
if (isVisible())
{
hide();
}
else
{
//Set new position before showing the window
m_y_pos = m_y_pos == 100 ? 400 : 100;
show();
}
}
//Paint rectangles at different positions
void paintEvent(QPaintEvent* event)
{
QPainter painter(this);
painter.setBrush(Qt::red);
painter.setPen(Qt::black);
for (int i = 0; i < event->rect().width(); i += 50)
{
painter.drawRect(m_x_pos + i, m_y_pos, 30, 30);
}
}
};
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QtGuiApplication w;
w.show();
return a.exec();
}
내가 여기 당신의 문제를 재현 할 수는 없지만 일반적으로는'업데이 트를 호출하여 위젯을 업데이트해야하는 페인트 시스템을 알려야한다()'때마다 위젯의 모양을 변경할 매개 변수를 변경할 수 있습니다. (즉, Tick()에'm_y_pos'를 설정 한 직후에 귀하의 경우) – E4z9
Aero가 활성화 된 Windows 7에서만 동작이 재현 가능합니다. 귀하의 솔루션에 대해 – pulp