如何知道QDockWidget是通过按钮还是通过拖动来取消停靠?

Top*_*opo 2 c++ qt qt4

我是Qt的新手,我不知道如何解决这个问题.当用户点击取消停靠按钮时,我有一个放在某个位置的QDockWidget(我不知道它的名字).发生这种情况时,窗口小部件的可见性会发生两次变化,因为它会消失并再次出现但不会停止.在它被取消停靠之后把它放在某个位置我在可见性改变事件中使用它:

if (ui->searchBar->isFloating()) {
    int x = (this->x() + this->width()) - 410;
    int y = (this->y() + this->height()) - 70;
    ui->searchBar->setGeometry(QRect(x,y,400,60));
}
Run Code Online (Sandbox Code Playgroud)

问题是在Linux中,如果我通过拖动来移除小部件而不是单击取消停靠按钮,当我将其放在窗口的某个位置时,它会自动移动到上面代码指定的位置.这是有道理的,但这不会发生在Windows中(我需要应用程序在两个操作系统中运行).在Windows中,如果单击该按钮,它将转到指定位置,但如果您拖动它,则它将保持在您放置它的位置.

为了解决这个问题,我计划仅在未拖动窗口小部件时才使用上面的代码,但我不知道如何执行此操作.有人可以帮助我或更好地了解如何解决这个问题吗?

han*_*ank 5

QDockWidget有一个名为'qt_dockwidget_floatbutton'的未记录按钮.您可以像这样访问它:

QAbstractButton* button = 
        YourDockWidget->findChild<QAbstractButton*>("qt_dockwidget_floatbutton");

connect(button, SIGNAL(clicked()), this, SLOT(yourSlot()));
Run Code Online (Sandbox Code Playgroud)

因此,只有在通过按钮取消停靠时,您才可以将代码放在该插槽上方以移动窗口小部件.