2009-09-01 19 views
11

L'applicazione su cui sto lavorando ha un'interfaccia utente personalizzata che mi ha richiesto di rimuovere la barra del titolo dalla finestra principale. Purtroppo, non riesco a capire come fare in modo che possa spostare l'applicazione sulla schermata :)QT4 Trascinare la finestra senza barra del titolo

Il codice che ho che è la rimozione della barra del titolo è il seguente:

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

Qualsiasi idea come posso spostare la finestra usando un altro widget o la finestra principale del modulo stesso?

Grazie

risposta

13

modo più intuitivo per farlo sarebbe essere cliccando sulla superficie widget e trascinamento. Per raggiungere questo obiettivo, è necessario seguire alcuni passaggi.

Il metodo è il seguente: Quando l'utente preme all'interno del widget, imposta un flag booleano e memorizza la posizione del mouse e quindi quando viene rilasciato il pulsante, impostarlo su false. Il prossimo passo è spostare il widget. In mouseMoveEvent, controlla se il flag è impostato. Se è impostato, prendi la nuova posizione del mouse. Calcola la differenza tra la nuova posizione e quella memorizzata. Quindi, imposta la posizione della finestra sulla posizione originale + il movimento del mouse calcolato. Quindi memorizzare la nuova posizione del mouse.

Il codice necessario sarebbe questo:

ATTENZIONE: Questo esempio di codice non è corretto e si tradurrà in un comportamento che salta quando si trascina la finestra. Si prega di utilizzare il codice dal Qt Shaped Clock example invece.

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

Vedere anche l'esempio di orologio a forma di Qt, che fa la stessa cosa: http://doc.trolltech.com/4.5/widgets -shapedclock.html –

+0

erelender, Anche dopo più di un anno torno ancora alla mia domanda per ottenere una risposta. Grazie ancora per aver fornito questo. =) Io invece uso globalPos(), altrimenti è jumpy – Michael

+0

@Michael, grazie, sono sempre felice di aiutare :) – erelender

3

Si dovrebbe provare questo invece

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

Non remenber molto bene, ma è possibile registrare un gestore di eventi personalizzato, è facile ci sono tanti esempi su google. controllare l'evento del mouse, prima di poter utilizzare QObject :: sender() e ottenere il metaoggetto per conoscere la classe dell'oggetto che viene premuto se l'oggetto è un qframe o qwidget o un'altra classe che si desidera utilizzare per spostare la finestra . allora puoi applicare una logica per trascinare la finestra. i pro sono che puoi usare con tutte le finestre e frame senza reimplementare ognuno di essi con gli eventi del mouse

Problemi correlati