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
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
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. –
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