QT5 QGraphicsView同时添加大量QGraphicsItem造成卡顿,线程解决方法,示例代码
时间: 2023-08-26 19:31:13 浏览: 251
下面是一个简单的示例代码,演示了如何使用线程来优化QT5 QGraphicsView中大量QGraphicsItem的添加操作:
```cpp
// MyThread.h
#ifndef MYTHREAD_H
#define MYTHREAD_H
#include <QThread>
#include <QGraphicsScene>
#include <QGraphicsRectItem>
class MyThread : public QThread
{
Q_OBJECT
public:
explicit MyThread(QGraphicsScene* scene, QObject *parent = nullptr);
void run() override;
signals:
void itemAdded(QGraphicsItem* item);
private:
QGraphicsScene* m_scene;
};
#endif // MYTHREAD_H
// MyThread.cpp
#include "MyThread.h"
MyThread::MyThread(QGraphicsScene* scene, QObject *parent) :
QThread(parent),
m_scene(scene)
{
}
void MyThread::run()
{
for (int i = 0; i < 10000; i++) {
QGraphicsRectItem* item = new QGraphicsRectItem(QRectF(0, 0, 100, 100));
item->setPos(i * 100, 0);
emit itemAdded(item);
}
}
// MainWindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <QGraphicsScene>
#include <QGraphicsView>
#include "MyThread.h"
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow(QWidget *parent = nullptr);
~MainWindow();
private slots:
void onItemAdded(QGraphicsItem* item);
private:
Ui::MainWindow *ui;
QGraphicsScene* m_scene;
QGraphicsView* m_view;
MyThread* m_thread;
};
#endif // MAINWINDOW_H
// MainWindow.cpp
#include "MainWindow.h"
#include "ui_MainWindow.h"
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
m_scene = new QGraphicsScene(this);
m_view = new QGraphicsView(m_scene, this);
setCentralWidget(m_view);
m_thread = new MyThread(m_scene, this);
connect(m_thread, &MyThread::itemAdded, this, &MainWindow::onItemAdded);
m_thread->start();
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::onItemAdded(QGraphicsItem* item)
{
m_scene->addItem(item);
m_view->update();
}
```
该示例代码中,我们创建了一个MyThread类,用于在子线程中创建QGraphicsItem。MyThread类中定义了一个itemAdded信号,用于在子线程中将创建好的QGraphicsItem添加到主线程中的QGraphicsScene中。
在MainWindow中,我们创建了一个QGraphicsScene和一个QGraphicsView,将QGraphicsScene设置为QGraphicsView的场景。然后,我们创建了一个MyThread对象,并将其和QGraphicsItem的创建和添加操作相关联。
在MyThread的run()函数中,我们创建了10000个QGraphicsRectItem,并通过emit itemAdded(item)信号将其添加到主线程中的QGraphicsScene中。
在MainWindow的onItemAdded()函数中,我们将创建好的QGraphicsItem添加到QGraphicsScene中,并调用m_view->update()函数更新界面。
运行该示例代码,可以看到在添加QGraphicsItem的过程中,界面仍然可以响应其他的操作,不会出现卡顿的情况。
阅读全文