问题 QT4拖动窗口没有标题栏


我正在处理的应用程序有一个自定义UI,要求我从主窗口中删除标题栏。不幸的是,我无法弄清楚如何制作它所以我可以在屏幕上移动应用程序:)

我删除标题栏的代码如下:

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent, Qt::CustomizeWindowHint), ui(new Ui::MainWindowClass)
{
    ui->setupUi(this);

任何想法我如何使用另一个小部件或主窗体窗口本身移动窗口?

谢谢


2981
2017-09-01 07:55


起源



答案:


最直观的方法是单击小部件表面并拖动。为了实现这一目标,您需要遵循一些步骤。

方法如下:当用户按下窗口小部件时,设置布尔标志并存储鼠标的位置,然后当释放按钮时,将其设置为false。下一步是移动小部件。在mouseMoveEvent中,检查是否设置了标志。如果已设置,请使用鼠标的新位置。计算新位置和存储位置之间的差异。然后,将窗口的位置设置为原始位置+计算的鼠标移动。然后存储新的鼠标位置。

所需的代码是这样的:

警告:此代码示例不正确,拖动窗口时会导致跳跃行为。请使用来自的代码 Qt形时钟示例 代替。

/// Header contents:
class MyWidget : public QMainWindow
{
protected:
    void mouseMoveEvent(QMouseEvent* event);
    void mousePressEvent(QMouseEvent* event);
    void mouseReleaseEvent(QMouseEvent* event);
private:
    QPoint mLastMousePosition;
    bool mMoving;
}
/// Source:
void MyWidget::mousePressEvent(QMouseEvent* event)
{
    if(event->button() == Qt::LeftButton)
    {
        mMoving = true;
        mLastMousePosition = event->pos();
    }
}

void MyWidget::mouseMoveEvent(QMouseEvent* event)
{
    if( event->buttons().testFlag(Qt::LeftButton) && mMoving)
    {
        this->move(this->pos() + (event->pos() - mLastMousePosition));
        mLastMousePosition = event->pos();
    }
}

void MyWidget::mouseReleaseEvent(QMouseEvent* event)
{
    if(event->button() == Qt::LeftButton)
    {
        mMoving = false;
    }
}

13
2017-09-01 08:15



另请参阅Qt的形状时钟示例,它执行相同的操作: doc.trolltech.com/4.5/widgets-shapedclock.html - Caleb Huitt - cjhuitt
erelender,即使在一年多之后,我仍然回到我自己的问题来得到你的答案。再次感谢您提供此功能。 =)我确实使用globalPos(),否则它是跳跃的 - Michael
@Michael谢谢,我总是很乐意帮忙:) - erelender
正如我在下面提到的,使用window-> move()只会移动窗口 内 屏幕,没有角落可以移动到外面,这是一个非常不同的 Windows经理 不 - saeedgnu
这就是为什么SO不鼓励在答案中使用LINKS。时钟示例的所有链接都已死亡。干得好的伙计们。 - GeneCode


答案:


最直观的方法是单击小部件表面并拖动。为了实现这一目标,您需要遵循一些步骤。

方法如下:当用户按下窗口小部件时,设置布尔标志并存储鼠标的位置,然后当释放按钮时,将其设置为false。下一步是移动小部件。在mouseMoveEvent中,检查是否设置了标志。如果已设置,请使用鼠标的新位置。计算新位置和存储位置之间的差异。然后,将窗口的位置设置为原始位置+计算的鼠标移动。然后存储新的鼠标位置。

所需的代码是这样的:

警告:此代码示例不正确,拖动窗口时会导致跳跃行为。请使用来自的代码 Qt形时钟示例 代替。

/// Header contents:
class MyWidget : public QMainWindow
{
protected:
    void mouseMoveEvent(QMouseEvent* event);
    void mousePressEvent(QMouseEvent* event);
    void mouseReleaseEvent(QMouseEvent* event);
private:
    QPoint mLastMousePosition;
    bool mMoving;
}
/// Source:
void MyWidget::mousePressEvent(QMouseEvent* event)
{
    if(event->button() == Qt::LeftButton)
    {
        mMoving = true;
        mLastMousePosition = event->pos();
    }
}

void MyWidget::mouseMoveEvent(QMouseEvent* event)
{
    if( event->buttons().testFlag(Qt::LeftButton) && mMoving)
    {
        this->move(this->pos() + (event->pos() - mLastMousePosition));
        mLastMousePosition = event->pos();
    }
}

void MyWidget::mouseReleaseEvent(QMouseEvent* event)
{
    if(event->button() == Qt::LeftButton)
    {
        mMoving = false;
    }
}

13
2017-09-01 08:15



另请参阅Qt的形状时钟示例,它执行相同的操作: doc.trolltech.com/4.5/widgets-shapedclock.html - Caleb Huitt - cjhuitt
erelender,即使在一年多之后,我仍然回到我自己的问题来得到你的答案。再次感谢您提供此功能。 =)我确实使用globalPos(),否则它是跳跃的 - Michael
@Michael谢谢,我总是很乐意帮忙:) - erelender
正如我在下面提到的,使用window-> move()只会移动窗口 内 屏幕,没有角落可以移动到外面,这是一个非常不同的 Windows经理 不 - saeedgnu
这就是为什么SO不鼓励在答案中使用LINKS。时钟示例的所有链接都已死亡。干得好的伙计们。 - GeneCode


你应该试试这个

class MyWidget : public QMainWindow
{
protected:
    void mouseMoveEvent(QMouseEvent* event);
    void mousePressEvent(QMouseEvent* event);
    void mouseReleaseEvent(QMouseEvent* event);
private:
    QPoint mLastMousePosition;
    bool mMoving;
}
/// Source:
void MyWidget::mousePressEvent(QMouseEvent* event)
{
    if(event->button() == Qt::LeftButton)
    {
        mMoving = true;
        mLastMousePosition = event->pos();
    }
}

void MyWidget::mouseMoveEvent(QMouseEvent* event)
{
    if( event->buttons().testFlag(Qt::LeftButton) && mMoving)
    {
        this->move(this->pos() + (event->pos() - mLastMousePosition));
    }
}

void MyWidget::mouseReleaseEvent(QMouseEvent* event)
{
    if(event->button() == Qt::LeftButton)
    {
        mMoving = false;
    }
}

3
2017-08-19 17:35





我不太清楚,但你可以注册一个自定义事件处理程序,很容易在谷歌上有这么多的例子。检查鼠标事件,在此之前你可以使用QObject :: sender()并让metaobject知道如果对象是qframe或qwidget或要用于移动窗口的另一个类,则按下该对象的类。然后你可以应用逻辑来拖动窗口。专业人士可以使用所有窗口和框架,而无需使用鼠标事件重新实现每个窗口和框架


0
2017-12-07 03:41