2009-09-01 19 views
11

La aplicación en la que estoy trabajando tiene una interfaz de usuario personalizada que me exige eliminar la barra de título de la ventana principal. Por desgracia, no puedo encontrar la manera de hacer que por lo que puede mover la aplicación en la pantalla :)QT4 Ventana de arrastre sin barra de título

El código que tengo, que es la eliminación de la barra de título es el siguiente:

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

Cualquier idea ¿Cómo puedo mover la ventana usando otro widget o la ventana principal del formulario?

Gracias

Respuesta

13

forma más intuitiva de hacer esto sería hacer clic en la superficie widget y arrastrando. Para lograr esto, debe seguir algunos pasos.

El método es el siguiente: cuando el usuario presiona dentro del widget, establezca un indicador booleano y almacene la posición del mouse y luego cuando se suelte el botón, configúrelo en falso. El siguiente paso es mover el widget. En mouseMoveEvent, compruebe si el indicador está establecido. Si está configurado, toma la nueva posición del mouse. Calcule la diferencia entre la nueva posición y la almacenada. Luego, configure la posición de la ventana en la posición original + el movimiento calculado del mouse. Luego, almacena la nueva posición del mouse.

El código requerido sería la siguiente:

ADVERTENCIA: Este ejemplo de código es incorrecto y dará lugar a un comportamiento de salto al arrastrar la ventana. Utilice el código del Qt Shaped Clock example en su lugar.

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

Vea también el ejemplo del reloj en forma de Qt, que hace lo mismo: http://doc.trolltech.com/4.5/widgets -shapedclock.html –

+0

erelender, Incluso después de más de un año sigo volviendo a mi propia pregunta para obtener su respuesta. Gracias de nuevo por proporcionar esto. =) Sí uso globalPos() en cambio, de lo contrario es saltarín – Michael

+0

@Michael gracias, siempre estoy dispuesto a ayudar :) – erelender

3

Debe probar este lugar

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

no me remenber muy bien, pero se puede registrar un controlador de eventos personalizado, es fácil que hay muchos ejemplos en Google. compruebe el evento del mouse, antes de eso puede usar QObject :: sender() y obtener el metaobjeto para conocer la clase del objeto que se presiona si el objeto es un qframe o qwidget u otra clase que desea usar para mover la ventana . entonces puedes aplicar una lógica para arrastrar la ventana. lo mejor es que puede usarlo con todas las ventanas y marcos sin necesidad de volver a implementar cada uno de ellos con eventos del mouse

Cuestiones relacionadas