我在窗口中有“我的小部件”。有没有办法知道窗口是否从“我的小部件”内移动?我在QWidget中看到了一些函数,但他们都只考虑在Widget和它的父级之间建立关系。当窗口小部件相对于屏幕移动时是否有任何事件被调用?
答案 0 :(得分:1)
处理窗口的moveEvent并让它向您的窗口小部件发送信号,然后您可以在接收槽中处理它。
如果无法修改父项,您可以创建一个从QObject派生的对象,重载其moveEvent函数,就好像它是父窗口一样,然后将此对象安装为父窗口的事件过滤器,致电父母 - > installEventFilter。
事件过滤器对象将是这样的: -
class MoveEventMonitor : public QObject
{
Q_OBJECT
...
public:
signals:
void ParentMoved();
protected:
bool eventFilter(QObject *obj, QEvent *event);
};
bool MoveEventMonitor::eventFilter(QObject *obj, QEvent *event)
{
if (event->type() == QEvent::Move)
{
emit ParentMoved();
}
// standard event processing
return QObject::eventFilter(obj, event);
}
答案 1 :(得分:1)
您可以通过利用事件过滤来实现此目的。这里显示的是未经修改的QLabel
小部件。
移动事件仅在您停止移动窗口后发送。移动窗口时不会发送它。另请注意,您将收到的第一个事件可能包含伪(0,0)
坐标。这可能是某些平台上的Qt错误/功能。
#include <QtWidgets>
class WindowMoveMonitor : public QObject
{
Q_OBJECT
bool eventFilter(QObject * target, QEvent * event) override {
if (event->type() == QEvent::Move) {
auto ev = static_cast<QMoveEvent*>(event);
emit moved(ev->pos());
}
return QObject::eventFilter(target, event);
}
public:
WindowMoveMonitor(QWidget * widget, QObject * parent = 0) : QObject{parent}
{
Q_ASSERT(widget->window());
widget->window()->installEventFilter(this);
}
Q_SIGNAL void moved(const QPoint &);
};
int main(int argc, char *argv[])
{
QApplication app{argc, argv};
QLabel label{"..."};
WindowMoveMonitor monitor{&label};
QObject::connect(&monitor, &WindowMoveMonitor::moved, [&](const QPoint & p){
label.setText(QStringLiteral("x:%1 y:%2").arg(p.x()).arg(p.y()));
});
label.setMinimumSize(200, 50);
label.show();
return app.exec();
}
#include "main.moc"