2010-03-03 12 views
7

Hy tamQt - (? Powolne repaint) Przeprowadzka Frameless okno

Jestem nowy na Qt i próbowałem stworzyć Frameless okno, które jest dragable. Problem polega na tym, że jeśli przesunę okno ... są tysiące (przepraszam, nie wiem, jak to opisać po angielsku), dopóki nie przestanę. Czy istnieje sposób, aby to naprawić, czy też myślę w niewłaściwy sposób?

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(); 
} 

Pozdrowienia, Alex

+0

Próbowałem twojego przykładowego kodu z Qt 4.5.1 na Winwods Vista i działa dobrze, czy mógłbyś dokładniej opisać, co jest nie tak (co tysięcy?). – gregseth

+1

Zakładam, że "tysiące" odnosi się do dużej części fragmentów okna, które menedżer okien może zostawić, jeśli nie jest prawidłowo odświeżane w tle po przeniesieniu okna. Dla mnie brzmi to jak problem z menedżerem okien lub ewentualnie z osadzonym urządzeniem, które działa przy dużym obciążeniu procesora. –

+0

To jest dokładnie to, co mam na myśli. Ale dzieje się tak tylko wtedy, gdy przeciągam okno bez ramek na inną aplikację, taką jak Firefox. Na komputerze jego normalne zachowanie. Obciążenie procesora jest normalne, także GPU <5% – Alex

Odpowiedz

1

Możecie spróbować wywołanie b ase klasy metod w swoich metod chronionych. Na przykład:

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

nie mogę odtworzyć problemu (Ubuntu lub XP), ale jak o próby przetworzenia przemalować zdarzenia:

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

Może być, że system zaczyna brakować zasobów lub twoi sterownik ekranu jest "wolny". Wypróbuj za pomocą czystego restartu i otwórz tylko swoją aplikację.