2009-09-01 92 views
11

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

我有被删除标题栏的代码的应用程序如下:

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

任何想法我怎样才能使用其他窗口部件或主窗体本身来移动窗口?

谢谢

回答

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 – 2009-09-01 23:09:04

+0

erelender,即使经过一年以上,我仍然回到我自己的问题来得到您的答案。再次感谢提供这一点。 =)我使用globalPos()虽然不是,否则就心惊肉跳 – Michael 2012-01-30 17:51:04

+0

@迈克尔谢谢,我总是乐于帮助:) – erelender 2012-02-16 14:07:58

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

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