使用c++ qt 线程池加载QGraphicsItem数据到QGraphicsView中,qt版本5.8.0
时间: 2024-04-29 14:01:42 浏览: 144
Qt plugin+QGraphicsView
以下是一个简单的示例代码,展示了如何使用Qt线程池加载QGraphicsItem数据到QGraphicsView中:
```c++
#include <QApplication>
#include <QGraphicsView>
#include <QGraphicsScene>
#include <QThreadPool>
#include <QRunnable>
#include <QDebug>
class GraphicsItemLoader : public QObject, public QRunnable
{
Q_OBJECT
public:
explicit GraphicsItemLoader(QGraphicsScene* scene, QObject* parent = nullptr)
: QObject(parent)
, m_scene(scene)
{
}
void run() override
{
// 模拟加载数据
for (int i = 0; i < 100; ++i) {
QGraphicsEllipseItem* item = new QGraphicsEllipseItem(-10, -10, 20, 20);
item->setPos(qrand() % 100, qrand() % 100);
item->setBrush(QBrush(Qt::red));
emit itemLoaded(item);
}
emit finished();
}
signals:
void itemLoaded(QGraphicsItem* item);
void finished();
private:
QGraphicsScene* m_scene;
};
class GraphicsView : public QGraphicsView
{
Q_OBJECT
public:
explicit GraphicsView(QWidget* parent = nullptr)
: QGraphicsView(parent)
, m_scene(new QGraphicsScene(this))
{
setScene(m_scene);
}
public slots:
void addItem(QGraphicsItem* item)
{
m_scene->addItem(item);
}
private:
QGraphicsScene* m_scene;
};
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
GraphicsView view;
view.show();
// 创建线程池
QThreadPool* pool = QThreadPool::globalInstance();
pool->setMaxThreadCount(2);
// 创建加载任务
GraphicsItemLoader* loader = new GraphicsItemLoader(view.scene());
// 连接信号槽
QObject::connect(loader, &GraphicsItemLoader::itemLoaded, &view, &GraphicsView::addItem);
QObject::connect(loader, &GraphicsItemLoader::finished, loader, &GraphicsItemLoader::deleteLater);
// 提交任务到线程池
pool->start(loader);
return a.exec();
}
#include "main.moc"
```
在这个示例中,我们创建了一个`GraphicsItemLoader`类,它继承自`QRunnable`,表示它可以在Qt线程池中运行。在`run()`函数中,我们模拟加载数据的过程,创建了100个圆形QGraphicsEllipseItem,并使用`emit itemLoaded(item)`信号将它们发送到主线程。当所有数据加载完成时,我们使用`emit finished()`信号通知主线程。
在主线程中,我们创建了一个`GraphicsView`类,它继承自`QGraphicsView`,并创建了一个`QGraphicsScene`,将其设置为`GraphicsView`的场景。我们使用线程池的`QThreadPool::start()`函数将`GraphicsItemLoader`任务提交到线程池中。
在`GraphicsItemLoader`的信号槽中,我们将`itemLoaded()`信号连接到`GraphicsView`的`addItem()`槽中,以将加载的图形项添加到场景中。我们还将`finished()`信号连接到`GraphicsItemLoader`的`deleteLater()`槽中,以确保任务对象在完成后被正确删除。
运行这个示例程序,你会看到在主窗口中加载了100个圆形QGraphicsEllipseItem,它们是在后台线程中加载的,不会阻塞主线程。
阅读全文