2010-03-03 9 views
7

Hy dortQt - (? Langsam Repaint) bewegen Frameless Fenster

Ich bin neu in Qt und ich versuchte, ein Frameless Fenster zu schaffen, die dragable ist. Das Problem ist, wenn ich das Fenster bewege ... gibt es Tausende von (es tut mir leid, ich weiß nicht, wie man es auf Englisch beschreibt), bis ich aufhöre. Gibt es eine Möglichkeit, das zu beheben, oder denke ich in die falsche Richtung?

MyWindow.h

#include <QMainWindow> 
#include <QLabel> 
#include <QPushButton> 
#include <QMouseEvent> 

class MyWindow : public QMainWindow { 
    Q_OBJECT 
private: 
    QLabel *label_title,*label_quit; 
    QPushButton *bn_exit; 
    QPixmap *pixmap; 
    QPoint m_dragPosition; 

public: 
    MyWindow(QMainWindow *parent = 0, Qt::WindowFlags flags = 0); 
protected: 
    void paintEvent(QPaintEvent *event); 
    void mouseMoveEvent(QMouseEvent *event); 
    void mousePressEvent(QMouseEvent *event); 
}; 

MyWindow.cpp

#include "MyWindow.h" 
#include <QApplication> 
#include <QPainter> 
#include <QLabel> 

MyWindow::MyWindow(QMainWindow *parent, Qt::WindowFlags flags) : QMainWindow(parent,flags) { 

    resize(1024,576); 
    setWindowTitle("Versuch1"); 

    //Titel 
    label_title = new QLabel("irgendwas",this); 
    label_title->setGeometry(10,10,500,40); 
    label_title->setStyleSheet("font-family: Arial; letter-spacing: 4px;font-weight:bold; color : white;font-size: 30px"); 

    //Exit-Button 
    bn_exit = new QPushButton("[Exit]",this); 
    bn_exit->setGeometry(975,10,40,20); 
    bn_exit->setStyleSheet("QPushButton {font-family: Verdana; font-size:15px; top:0px; border: none; background-color:#101010; color:white} QPushButton:hover {color: red }"); 
    connect(bn_exit,SIGNAL(clicked()),qApp,SLOT(quit())); 
} 


void MyWindow::paintEvent(QPaintEvent *event) // Painter 
{ 
    QPainter painter(this); 
    painter.setPen(Qt::NoPen); // deactivate Border 

    painter.setBrush(QBrush("#101010")); // black title and footer 
    painter.drawRect(0, 0, 1024, 60); 

    painter.setBrush(QBrush("#101010")); 
    painter.drawRect(0, 516, 1024, 576); 
} 
void MyWindow::mouseMoveEvent(QMouseEvent *event) 
{ 
    if (event->buttons() & Qt::LeftButton) { 
     move(event->globalPos() - m_dragPosition); 
     event->accept(); 
    } 
} 
void MyWindow::mousePressEvent(QMouseEvent *event) 
{ 
    if (event->button() == Qt::LeftButton) { 
     m_dragPosition = event->globalPos() - frameGeometry().topLeft(); 
     event->accept(); 
    } 
} 

main.cpp

#include <QApplication> 
#include "MyWindow.h" 

int main(int argc, char *argv[]) { 
    QApplication app(argc, argv); 
    MyWindow* window = new MyWindow(0, Qt::FramelessWindowHint); 
    window->show(); 
    return app.exec(); 
} 

Grüße, Alex

+0

Ich habe versucht, Ihren Beispielcode mit Qt 4.5.1 auf Winwods Vista und es funktioniert gut, könnten Sie genauer beschreiben, was falsch ist (Tausende von was?). – gregseth

+1

Ich nehme an, die "Tausende davon" bezieht sich auf einen großen Teil der Fensterfragmente, die der Fenstermanager möglicherweise zurücklässt, wenn er den Hintergrund nicht korrekt aktualisiert, wenn das Fenster verschoben wird. Für mich klingt es wie ein Problem mit dem Window-Manager oder möglicherweise auf einem eingebetteten Gerät, das mit hoher CPU-Auslastung ausgeführt wird. –

+0

Das ist genau was ich meine. Aber es passiert nur, wenn ich das rahmenlose Fenster über eine andere Anwendung wie Firefox schiebe. Auf dem Desktop ist das ein normales Verhalten. CPU-Last ist normal, auch GPU <5% – Alex

Antwort

1

Vielleicht möchten Sie den Aufruf der b versuchen Verwenden Sie Klassenmethoden in Ihren geschützten Methoden. Zum Beispiel:

void MyWindow::paintEvent(QPaintEvent *event) // Painter 
{ 
    QWidget::paintEvent(event); 
    ... 
} 
void MyWindow::mouseMoveEvent(QMouseEvent *event) 
{ 
    QWidget::moveMouseEvent(event); 
    ... 
} 
0

ich nicht Ihr Problem (Ubuntu oder XP) reproduzieren können, aber wie zu versuchen, Ereignisse zu verarbeiten neu streichen:

if (event->buttons() & Qt::LeftButton) { 
    move(event->globalPos() - m_dragPosition); 
    event->accept(); 
    QCoreApplication::processEvents(QEventLoop::ExcludeUserInputEvents); 
} 

Es könnte sein, dass Ihr System nicht genügend Ressourcen ausgeführt wird oder Ihre Bildschirmtreiber ist "langsam". Versuchen Sie es mit einem sauberen Neustart und nur Ihre App geöffnet.