QT4拖动没有标题栏的窗口

Mic*_*ael 11 qt4

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

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

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

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

谢谢

ere*_*der 13

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

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

所需的代码是这样的:

警告:此代码示例不正确,并且在拖动窗口时将导致跳转行为.请使用Qt Shaped Clock示例中的代码.

/// 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;
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 另请参阅Qt的形状时钟示例,它执行相同的操作:http://doc.trolltech.com/4.5/widgets-shapedclock.html (3认同)