2010-03-03 2 views
7

Hy,Qt - Frameless window 이동 (느린 칠하기)

저는 Qt를 처음 사용하고 드래그 가능한 프레임리스 창을 만들려고했습니다. 문제는, 내가 창을 움직이면 .. 내가 멈출 때까지 수천 가지가있다. (미안, 영어로 설명하는 법을 모르겠다). 이 문제를 해결할 방법이 있습니까, 아니면 잘못된 생각입니까?

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

인사말, 알렉스

당신은 B를 호출하려고 할 수 있습니다
+0

Winwods Vista에서 Qt 4.5.1을 사용하여 샘플 코드를 시험해 보았지만 제대로 작동합니다. 무엇이 잘못되었는지 (수천 개가 무엇인가?) 정확하게 설명 할 수 있습니까? – gregseth

+1

"수천 개"라는 말은 창을 옮길 때 배경이 적절하게 새로 고쳐지지 않으면 창 관리자가 남길 수있는 창 조각의 상당 부분을 의미한다고 가정합니다. 나에게 이것은 창 관리자 나 아마도 높은 CPU 부하에서 실행되는 임베디드 장치의 문제처럼 들린다. –

+0

이것은 정확히 무슨 뜻입니까. 그러나 Firefox와 같은 anoter 응용 프로그램에서 프레임이없는 창을 드레 이싱하는 경우에만 발생합니다. 바탕 화면에서 정상적인 동작. CPU 부하가 정상이며 GPU <5 % – Alex

답변

1

보호 된 메서드에서 클래스 메서드를 호출하십시오. 내가 이벤트 칠 처리 시도에 대한 문제 (우분투 또는 XP)하지만 어떻게 재현 할 수

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

: 예를 들어

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

그것은 당신의 시스템 자원이나가 부족 될 수 있음을 당신의 디스플레이 드라이버가 느립니다. 깨끗한 재부팅으로 시도하고 앱만 엽니 다.