我试图通过在QMainWindow中使用另一个小部件来移动我的QMainWindow。
我移动我的窗口通过覆盖:
void mousePressEvent(QMouseEvent *event)
void mouseMoveEvent(QMouseEvent *event)在QTabWidget中。如果没有QWebEngineView小部件,窗口运行良好,一切正常,但是如果将QWebEngineView小部件添加到布局中,则窗口的移动是滞后的,有什么想法吗?
下面是一个最小的可重现性示例:
mainwindow.h:
#include <QMainWindow>
#include <QMouseEvent>
#include <QtWidgets/QtWidgets>
QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow(QWidget *parent = nullptr);
~MainWindow();
private:
Ui::MainWindow *ui;
};
class MyTabWidget : public QTabWidget
{
Q_OBJECT
public:
MyTabWidget(QWidget *parent = 0) : QTabWidget(parent){}
protected:
void mousePressEvent(QMouseEvent *event) override
{
QWidget::mousePressEvent(event);
pressPoint = event->pos();
}
void mouseMoveEvent(QMouseEvent *event) override
{
QWidget::mouseMoveEvent(event);
this->window()->move(this->window()->pos() + (event->pos() - pressPoint) );
}
private:
QPoint pressPoint;
};
#endif // MAINWINDOW_Hmainwindow.cpp:
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QWebEngineView>
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
MyTabWidget *tabWidget = new MyTabWidget(this);
ui->verticalLayout->addWidget(tabWidget);
QWidget *widget = new QWidget(this);
QHBoxLayout *hlayout = new QHBoxLayout(this);
QWebEngineView *view = new QWebEngineView(this);
widget->setLayout(hlayout);
hlayout->addWidget(view);
tabWidget->addTab(widget, "asd");
view->load(QUrl("https://www.google.com/"));
}
MainWindow::~MainWindow()
{
delete ui;
}在这段代码中,如果删除与QWebEngineView相关的所有内容,则窗口将无滞后地移动。
编辑:
这个例子做了这项工作,但是,有没有更好的方法来做到这一点呢?
setUpdatesEnabled(false); //This in mousePressEvent
bigVisualChanges();
setUpdatesEnabled(true); //This in mouseReleaseEvent我不喜欢这种方式,因为例如,如果我看了youtube视频,图像就会冻结。
发布于 2022-08-08 14:28:45
尝试以这种方式重新实现您的mousePressEvent和mouseMoveEvent,使用globalPosition()而不是pos()。为我工作过。窗户开始平稳地移动。
void mousePressEvent(QMouseEvent *event) override
{
pressPoint = event->globalPosition().toPoint();
QWidget::mousePressEvent(event);
}
void mouseMoveEvent(QMouseEvent *event) override
{
QPoint delta = event->globalPosition().toPoint() - pressPoint;
this->window()->move(this->window()->pos() + delta );
pressPoint = event->globalPosition().toPoint();
QWidget::mouseMoveEvent(event);
}更新:为了获得更好的web引擎性能(页面加载、视频播放和网页动画),构建在版本中的配置。
Update2:测试显示https://youtu.be/QM3UXjipr8Q。
https://stackoverflow.com/questions/73252000
复制相似问题