QT4无标题栏拖动窗口

11
我正在开发的应用程序有一个定制的用户界面,需要我从主窗口中删除标题栏。不幸的是,我无法弄清楚如何使应用程序在屏幕上移动 :)
以下是我用于删除标题栏的代码:
MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent, Qt::CustomizeWindowHint), ui(new Ui::MainWindowClass)
{
    ui->setupUi(this);

有什么办法可以使用其他小部件或主窗体本身来移动窗口吗?

谢谢

3个回答

13

最直观的方法是在小部件表面点击并拖动。为实现此目的,需要遵循以下步骤。

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

所需代码如下:

警告:此代码示例不正确,会导致拖动窗口时出现跳跃行为。请使用Qt Shaped Clock Example 中的代码。

/// 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;
    }
}

3
请参考Qt的形状时钟示例,它实现了相同的功能:http://doc.trolltech.com/4.5/widgets-shapedclock.html - Caleb Huitt - cjhuitt
erelender,即使过了一年,我仍然回来看自己的问题以获取你的答案。再次感谢你提供这个。=)不过,我使用globalPos()代替,否则会有跳动的情况。 - Michael
正如我在下面提到的那样,使用window->move()只能将窗口移动屏幕内,没有一个角落可以移动到外面,这与窗口管理器的工作非常不同。 - saeedgnu
这就是为什么 SO 不鼓励在答案中使用链接。所有时钟示例的链接都已失效。干得好,伙计们。 - GeneCode
只要答案不完全是链接,使用链接是可以的。例如,如果删除链接,此答案仍然有效。它们只是用来增强答案的。此外,预期的目标并不是网络上某个偏僻的角落,它仍然可以通过简单的搜索找到。没有必要讽刺。关于跳转行为的评论可能是有效的,我记得在多次使用此实现时没有这样的问题,但随着岁月的流逝,情况可能已经改变了。 - erelender

3
你应该尝试这个替代方案。
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;
    }
}

0

我记不太清了,但你可以注册一个自定义事件处理程序,这很容易,在谷歌上有很多例子。先检查鼠标事件,然后你可以使用QObject::sender()获取元对象来知道被按下的对象的类是qframe、qwidget还是其他你想用来移动窗口的类。然后你可以应用逻辑来拖动窗口。优点是你可以在不重新实现每个窗口和框架的鼠标事件的情况下使用它们。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接