【问题标题】:Qt - Moving Frameless window (slow repaint?)Qt - 移动无框窗口(重绘缓慢?)
【发布时间】:2011-01-23 06:42:08
【问题描述】:

你好,

我是 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 尝试了您的示例代码,它运行良好,您能否更准确地描述哪里出了问题(成千上万?)。
  • 我假设“数千个”是指窗口管理器在移动窗口时没有正确刷新背景时可能留下的大部分窗口碎片。对我来说,这听起来像是窗口管理器的问题,或者可能是在高 CPU 负载下运行的嵌入式设备上。
  • 这正是我的意思。但只有当我将无框窗口拖到另一个应用程序(如 Firefox)上时才会发生这种情况。在桌面上是正常行为。 CPU负载正常,GPU也
  • 这是否发生在运行 X 服务器的 Linux(或类似)系统上?如果是这样,您使用的是什么版本的 X 服务器(希望是 Xorg!)以及什么版本?您是否在使用合成窗口管理器(如 Compiz)?
  • 现在我使用的是 4.6.3 版本。 Win 7 x64 上的库,一切正常。

标签: qt mouse window move drag


【解决方案1】:

您可能想尝试在受保护的方法中调用基类方法。例如:

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

【讨论】:

    【解决方案2】:

    我无法重现您的问题(Ubuntu 或 XP),但如何尝试处理重绘事件:

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

    这可能是您的系统资源不足或您的显示驱动程序“慢”。尝试干净重启,只打开您的应用程序。

    【讨论】:

      猜你喜欢
      • 2014-03-04
      • 1970-01-01
      • 2013-04-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多