2009-09-01 7 views
11

Aplikacja, nad którą pracuję, ma niestandardowy interfejs użytkownika, który wymagał ode mnie usunięcia paska tytułu z głównego okna. Niestety, nie mogę dowiedzieć się, jak to zrobić, więc mogę przenieść aplikację na ekranie :)QT4 Przeciągnij okno bez paska tytułu

Kod mam, które usuwa pasek tytułowy jest następujący:

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

jakiś pomysł w jaki sposób mogę przenieść okno za pomocą innego widżetu lub samego głównego okna formularza?

Dzięki

Odpowiedz

13

najbardziej intuicyjnym sposobem na to byłoby klikając na powierzchni widget i przeciąganie. Aby to osiągnąć, musisz wykonać kilka kroków.

Sposób postępowania jest następujący: Kiedy użytkownik naciśnie w widgecie, ustaw flagę boolowską i zapamiętaj położenie myszy, a następnie po zwolnieniu przycisku ustaw wartość false. Następnym krokiem jest przeniesienie widgetu. W mouseMoveEvent sprawdź, czy flaga jest ustawiona. Jeśli jest ustawiony, weź nową pozycję myszy. Oblicz różnicę pomiędzy nową pozycją a tą zapisaną. Następnie ustaw pozycję okna na oryginalną pozycję + obliczony ruch myszy. Następnie zapisz nową pozycję myszy.

Kod wymagane byłoby to:

UWAGA: Ten przykład kod jest nieprawidłowy i spowoduje zachowanie skoków podczas przeciągania okna. Zamiast tego użyj kodu z 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

Zobacz także przykładowy zegar Qt, który robi to samo: http://doc.trolltech.com/4.5/widgets -shapedclock.html –

+0

erelender, Nawet po ponad roku wciąż wracam do mojego własnego pytania, aby uzyskać odpowiedź. Jeszcze raz dziękuję za dostarczenie tego. =) Używam zamiast tego globalPos(), w przeciwnym razie jest to niezręczne. – Michael

+0

@Michael dzięki, zawsze z przyjemnością pomogę :) – erelender

3

Należy spróbować zamiast

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

Nie remenber bardzo dobrze, ale można zarejestrować niestandardową procedurę obsługi zdarzenia, jest łatwy istnieje tak wiele przykładów na google. sprawdź zdarzenie myszy, zanim będziesz mógł użyć QObject :: sender() i pobierz metaobiekt, aby poznać klasę obiektu, która zostanie naciśnięta, jeśli obiektem jest qframe lub qwidget lub inna klasa, której chcesz użyć, aby przesunąć okno . następnie możesz zastosować logikę, aby przeciągnąć okno. zaletami jest to, że możesz używać wszystkich okien i ramek bez reimplementacji, każdy z nich z wydarzeniami myszy