Qt - Перемещение безрамного окна (медленная перекраска?) - PullRequest
7 голосов
/ 03 марта 2010

Hy там,

Я новичок в 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();
}

Привет, Alex

Ответы [ 2 ]

1 голос
/ 21 февраля 2011

Возможно, вы захотите попробовать вызвать методы базового класса в ваших защищенных методах. Например:

void MyWindow::paintEvent(QPaintEvent *event) // Painter
{
    QWidget::paintEvent(event);
    ...
}
void MyWindow::mouseMoveEvent(QMouseEvent *event)
{
    QWidget::moveMouseEvent(event);
    ...
}
0 голосов
/ 26 марта 2011

Я не смог воспроизвести вашу проблему (Ubuntu или XP), но как насчет попытки обработать события перерисовки:

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

Возможно, в вашей системе недостаточно ресурсов или драйвер дисплея работает медленно. Попробуйте с чистой перезагрузкой и откройте только ваше приложение.

...