2010-03-03 55 views
7

Hy đó,Qt - Di chuyển cửa sổ không khung (chậm sơn lại?)

Tôi mới vào Qt và tôi đã cố gắng tạo cửa sổ Frameless, có thể kéo được. Vấn đề là, nếu tôi di chuyển cửa sổ .. có hàng ngàn (nó? Xin lỗi, không biết làm thế nào để mô tả nó bằng tiếng Anh) cho đến khi tôi dừng lại. Có cách nào để sửa lỗi này hay tôi đang nghĩ sai?

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

Greetings, Alex

+0

Tôi đã thử mã mẫu của bạn với Qt 4.5.1 trên Winwods Vista và nó hoạt động tốt, bạn có thể mô tả chính xác hơn những gì sai (hàng ngàn cái gì không?). – gregseth

+1

Tôi cho rằng "hàng nghìn" là một phần lớn các đoạn cửa sổ mà trình quản lý cửa sổ có thể bỏ lại phía sau nếu nó không làm mới nền đúng cách khi cửa sổ được di chuyển. Đối với tôi, nó có vẻ giống như một vấn đề với trình quản lý cửa sổ, hoặc có thể trên một thiết bị nhúng đang chạy trên một tải CPU cao. –

+0

Đây chính xác là những gì tôi muốn nói. Nhưng nó chỉ xảy ra nếu tôi đang kéo cửa sổ không khung trên ứng dụng anoter như Firefox. Trên máy tính để bàn, đó là hành vi bình thường. Tải CPU là bình thường, cũng GPU <5% – Alex

Trả lời

1

Bạn có thể muốn thử gọi các b các phương thức lớp ase trong các phương thức được bảo vệ của bạn. Ví dụ:

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

tôi không thể tái tạo vấn đề của bạn (Ubuntu hoặc XP) nhưng làm thế nào về việc cố gắng để xử lý sơn lại các sự kiện:

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

Nó có thể được rằng hệ thống của bạn đang ở mức thấp trên tài nguyên hoặc bạn trình điều khiển hiển thị là "chậm". Hãy thử nó với khởi động lại sạch sẽ và chỉ ứng dụng của bạn mở.

Các vấn đề liên quan