有关运动的信息。 QT C ++

时间:2014-07-09 14:36:44

标签: c++ qt

我在窗口中有“我的小部件”。有没有办法知道窗口是否从“我的小部件”内移动?我在QWidget中看到了一些函数,但他们都只考虑在Widget和它的父级之间建立关系。当窗口小部件相对于屏幕移动时是否有任何事件被调用?

2 个答案:

答案 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"