QT4拖动窗口没有标题栏(QT4 Drag Window Without Title Bar)

2019-07-04 05:07发布

我工作的应用程序有,需要我从主窗口中删除标题栏自定义用户界面。 不幸的是,我无法弄清楚如何使它这样我就可以在屏幕上移动应用:)

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

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

任何想法如何,我可以移动窗口周围使用任何其他Widget或主窗体窗口本身?

谢谢

Answer 1:

最直观的方式做到这一点会被点击的小部件表面并拖动。 为了实现这一点,你需要遵循一些步骤。

该方法进行如下:当用户按压小部件内,设置一个布尔标志并存储该鼠标的位置,然后释放该按钮时,其设置为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;
    }
}


Answer 2:

你应该试试这个吧

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


Answer 3:

我不remenber非常好,但是你可以注册一个自定义事件处理程序,很容易有对谷歌这样的例子很多。 检查鼠标事件,在此之前,你可以使用的QObject ::发件人(),并获得元对象知道该对象的类别塔被按下,如果对象是要使用移动窗口qframe或QWidget的或其他类。 那么你可以申请拖动窗口逻辑。 优点是,你可以与所有窗口和框架使用没有重新实现他们中的每一个鼠标事件



文章来源: QT4 Drag Window Without Title Bar
标签: qt4