Hy there,Qt - 移動無框窗口(緩慢重繪?)
我是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();
}
問候, 亞歷
我在Winwods Vista上用Qt 4.5.1試過了你的示例代碼,它工作正常,你能更準確地描述什麼是錯的(成千上萬?)。 – gregseth 2010-03-04 10:34:18
我假設「成千上萬」是指窗口管理器可能留下的大部分窗口碎片,如果它在窗口移動時沒有正確刷新背景。對我來說,這聽起來像是窗口管理器的一個問題,或者可能在運行CPU負載很高的嵌入式設備上。 – 2010-03-04 19:13:40
這正是我的意思。但是,只有當我通過諸如Firefox等應用程序應用程序拖動無框窗口時纔會發生。在桌面上它是一個正常的行爲。 CPU負載是正常的,也是GPU <5% – Alex 2010-03-09 16:04:50