Перенес формирование Item ов в отдельный поток

This commit is contained in:
krivoshein
2025-01-23 17:54:21 +03:00
parent 2ab543d6eb
commit d6c78ba428
9 changed files with 166 additions and 5 deletions

View File

@@ -78,6 +78,8 @@ add_library(InstructorsAndTrainees SHARED
tasks/fimtaskswidget.cpp tasks/fimtaskswidget.cpp
tasks/fimtaskswidget.h tasks/fimtaskswidget.h
tasks/fimtaskswidget.ui tasks/fimtaskswidget.ui
tasks/tasktreepreparation.cpp
tasks/tasktreepreparation.h
#tasks/tasksAmmFim.cpp #tasks/tasksAmmFim.cpp
#tasks/tasksAmmFim.h #tasks/tasksAmmFim.h
widgets/newversionwidget.cpp widgets/newversionwidget.cpp

View File

@@ -27,6 +27,8 @@ InstructorsAndTraineesWidget::InstructorsAndTraineesWidget(QWidget *parent) :
qRegisterMetaType<QList<Group>>("QList<Group>"); qRegisterMetaType<QList<Group>>("QList<Group>");
qRegisterMetaType<QList<Computer>>("QList<Computer>"); qRegisterMetaType<QList<Computer>>("QList<Computer>");
qRegisterMetaType<QList<Classroom>>("QList<Classroom>"); qRegisterMetaType<QList<Classroom>>("QList<Classroom>");
qRegisterMetaType<QList<Module*>>("QList<Module*>");
qRegisterMetaType<QList<QTreeWidgetItem*>>("QList<QTreeWidgetItem*>");
qDebug() << "InstructorsAndTraineesWidget init thread ID " << QThread::currentThreadId(); qDebug() << "InstructorsAndTraineesWidget init thread ID " << QThread::currentThreadId();

View File

@@ -16,6 +16,9 @@ Q_DECLARE_METATYPE(QList<Trainee>)
Q_DECLARE_METATYPE(QList<Group>) Q_DECLARE_METATYPE(QList<Group>)
Q_DECLARE_METATYPE(QList<Computer>) Q_DECLARE_METATYPE(QList<Computer>)
Q_DECLARE_METATYPE(QList<Classroom>) Q_DECLARE_METATYPE(QList<Classroom>)
Q_DECLARE_METATYPE(QList<Module*>)
Q_DECLARE_METATYPE(QList<QTreeWidgetItem*>)
namespace Ui { namespace Ui {
class InstructorsAndTraineesWidget; class InstructorsAndTraineesWidget;

View File

@@ -3,6 +3,7 @@
#include <QDomDocument> #include <QDomDocument>
#include <QMessageBox> #include <QMessageBox>
#include <QThread> #include <QThread>
#include <QResizeEvent>
#include "ammtaskswidget.h" #include "ammtaskswidget.h"
#include "ui_ammtaskswidget.h" #include "ui_ammtaskswidget.h"
@@ -24,6 +25,20 @@ AMMtasksWidget::AMMtasksWidget(ConnectorToServer* connectorToServer, QWidget *pa
ui->btnAssignTaskToTrainee->setEnabled(false); ui->btnAssignTaskToTrainee->setEnabled(false);
qDebug() << "AMMtasksWidget init thread ID " << QThread::currentThreadId(); qDebug() << "AMMtasksWidget init thread ID " << QThread::currentThreadId();
threadPreparation = new QThread();
taskTreePreparation = new TaskTreePreparation();
taskTreePreparation->moveToThread(threadPreparation);
threadPreparation->start();
threadPreparation->setPriority(QThread::HighestPriority);
connect(this, &AMMtasksWidget::signal_prepareListItems, taskTreePreparation, &TaskTreePreparation::slot_prepareListItems);
connect(taskTreePreparation, &TaskTreePreparation::signal_listItemsReady, this, &AMMtasksWidget::slot_listItemsReady);
waitAnimationWidget = new WaitAnimationWidget;
QMovie *movie = new QMovie(":/resources/icons/762.gif");
waitAnimationWidget->setParent(this);
waitAnimationWidget->initialize(movie,this);
waitAnimationWidget->moveToThread(threadPreparation);
} }
AMMtasksWidget::~AMMtasksWidget() AMMtasksWidget::~AMMtasksWidget()
@@ -32,6 +47,12 @@ AMMtasksWidget::~AMMtasksWidget()
delete ui; delete ui;
} }
void AMMtasksWidget::resizeEvent(QResizeEvent *event)
{
QSize size = event->size();
waitAnimationWidget->resize(size);
}
void AMMtasksWidget::on_treeWidget_currentItemChanged(QTreeWidgetItem *current, QTreeWidgetItem *previous) void AMMtasksWidget::on_treeWidget_currentItemChanged(QTreeWidgetItem *current, QTreeWidgetItem *previous)
{ {
if(current == nullptr) if(current == nullptr)
@@ -85,10 +106,26 @@ void AMMtasksWidget::loadTasksAMM()
//Обновление дерева //Обновление дерева
treeWidget->clear(); treeWidget->clear();
waitAnimationWidget->showWithPlay();
QByteArray array = connectorToServer->getListTaskAmmArray(); QByteArray array = connectorToServer->getListTaskAmmArray();
loadAMMtasksFromXML(array); loadAMMtasksFromXML(array);
fillTree(); //fillTree();
signal_prepareListItems(listAllModules);
}
void AMMtasksWidget::slot_listItemsReady(QList<QTreeWidgetItem *> listItems)
{
//Обновление дерева
treeWidget->clear();
for(QTreeWidgetItem * item : listItems)
{
treeWidget->addTopLevelItem(item);
}
waitAnimationWidget->hideWithStop();
} }
void AMMtasksWidget::domElementParser(QDomElement element, Module* moduleParent) void AMMtasksWidget::domElementParser(QDomElement element, Module* moduleParent)
@@ -258,11 +295,12 @@ void AMMtasksWidget::fillTree()
for(Module* module : listAllModules) for(Module* module : listAllModules)
{ {
addModuleToTreeWidget(module); QTreeWidgetItem* item = addModuleToTreeWidget(module);
treeWidget->addTopLevelItem(item);
} }
} }
void AMMtasksWidget::addModuleToTreeWidget(Module *module, QTreeWidgetItem* parentItem) QTreeWidgetItem* AMMtasksWidget::addModuleToTreeWidget(Module *module, QTreeWidgetItem* parentItem)
{ {
QTreeWidgetItem* itemModule = nullptr; QTreeWidgetItem* itemModule = nullptr;
@@ -276,7 +314,8 @@ void AMMtasksWidget::addModuleToTreeWidget(Module *module, QTreeWidgetItem* pare
} }
else else
{ {
itemModule = new QTreeWidgetItem(treeWidget); //itemModule = new QTreeWidgetItem(treeWidget);
itemModule = new QTreeWidgetItem();
} }
if(module->getType() == ModuleType::TYPE_PM) if(module->getType() == ModuleType::TYPE_PM)
@@ -301,6 +340,8 @@ void AMMtasksWidget::addModuleToTreeWidget(Module *module, QTreeWidgetItem* pare
itemModule->setText(ColumnsTree::clmn_PMorDM, text); itemModule->setText(ColumnsTree::clmn_PMorDM, text);
itemModule->setText(ColumnsTree::clmn_ID, ID); itemModule->setText(ColumnsTree::clmn_ID, ID);
return itemModule;
} }

View File

@@ -6,6 +6,7 @@
#include <QDomNode> #include <QDomNode>
#include "module.h" #include "module.h"
#include "connectortoserver.h" #include "connectortoserver.h"
#include "taskTreePreparation.h"
namespace Ui { namespace Ui {
class AMMtasksWidget; class AMMtasksWidget;
@@ -31,6 +32,9 @@ public:
treeWidget->clear(); treeWidget->clear();
} }
public:
void resizeEvent(QResizeEvent *event) override;
private Q_SLOTS: private Q_SLOTS:
void on_treeWidget_currentItemChanged(QTreeWidgetItem *current, QTreeWidgetItem *previous); void on_treeWidget_currentItemChanged(QTreeWidgetItem *current, QTreeWidgetItem *previous);
void on_btnUpdateTasks_clicked(); void on_btnUpdateTasks_clicked();
@@ -53,10 +57,15 @@ private:
void reSetHeadTreeWidget(); void reSetHeadTreeWidget();
void fillTree(); void fillTree();
void addModuleToTreeWidget(Module* module, QTreeWidgetItem* parentItem = nullptr); QTreeWidgetItem* addModuleToTreeWidget(Module* module, QTreeWidgetItem* parentItem = nullptr);
void loadTasksAMM(); void loadTasksAMM();
Q_SIGNALS:
void signal_prepareListItems(QList<Module*> listAllModules);
public Q_SLOTS:
void slot_listItemsReady(QList<QTreeWidgetItem*> listItems);
private: private:
Ui::AMMtasksWidget *ui; Ui::AMMtasksWidget *ui;
ConnectorToServer* connectorToServer; ConnectorToServer* connectorToServer;
@@ -65,6 +74,10 @@ private:
private: private:
QList<Module*> listAllModules; QList<Module*> listAllModules;
QString loginTraineeSelected; QString loginTraineeSelected;
QThread* threadPreparation;
TaskTreePreparation* taskTreePreparation;
WaitAnimationWidget *waitAnimationWidget;
}; };
#endif // AMMTASKSWIDGET_H #endif // AMMTASKSWIDGET_H

View File

@@ -0,0 +1,67 @@
#include <QThread>
#include <QDebug>
#include "tasktreepreparation.h"
TaskTreePreparation::TaskTreePreparation(QObject *parent) : QObject(parent)
{
qDebug() << "TaskTreePreparation init thread ID " << QThread::currentThreadId();
}
QTreeWidgetItem *TaskTreePreparation::addModuleToTreeWidget(Module *module, QTreeWidgetItem *parentItem)
{
QTreeWidgetItem* itemModule = nullptr;
QString text;
QString ID = QString::number(module->getID());
if(parentItem)
{
itemModule = new QTreeWidgetItem();
parentItem->addChild(itemModule);
}
else
{
//itemModule = new QTreeWidgetItem(treeWidget);
itemModule = new QTreeWidgetItem();
}
if(module->getType() == ModuleType::TYPE_PM)
{
PM* PMmodul = static_cast<PM*>(module);
text = PMmodul->getLangStructRus().title;
for(Module* module : PMmodul->getListChildModules())
{
addModuleToTreeWidget(module, itemModule);
}
}
else
{
DM* DMmodul = static_cast<DM*>(module);
text = DMmodul->getLangStructRus().techName;
//itemModule->setFlags(itemModule->flags() | Qt::ItemIsUserCheckable);
//itemModule->setCheckState(0, Qt::Checked);
itemModule->setIcon(0, QIcon(":/resources/icons/procedure.png"));
}
itemModule->setText(0, text);
itemModule->setText(1, ID);
return itemModule;
}
void TaskTreePreparation::slot_prepareListItems(QList<Module *> listAllModules)
{
qDebug() << "TaskTreePreparation::slot_prepareListItems thread ID " << QThread::currentThreadId();
listItems.clear();
for(Module* module : listAllModules)
{
QTreeWidgetItem* item = addModuleToTreeWidget(module);
listItems.append(item);
}
Q_EMIT signal_listItemsReady(listItems);
}

View File

@@ -0,0 +1,27 @@
#ifndef TASKTREEPREPARATION_H
#define TASKTREEPREPARATION_H
#include <QObject>
#include <QTreeWidgetItem>
#include "module.h"
class TaskTreePreparation : public QObject
{
Q_OBJECT
public:
explicit TaskTreePreparation(QObject *parent = nullptr);
public:
QTreeWidgetItem* addModuleToTreeWidget(Module* module, QTreeWidgetItem* parentItem = nullptr);
public Q_SLOTS:
void slot_prepareListItems(QList<Module*> listAllModules);
Q_SIGNALS:
void signal_listItemsReady(QList<QTreeWidgetItem*> listItems);
private:
QList<QTreeWidgetItem*> listItems;
};
#endif // TASKTREEPREPARATION_H

View File

@@ -29,6 +29,11 @@ void WaitAnimationWidget::hideWithStop()
loadingMovie->stop(); loadingMovie->stop();
} }
void WaitAnimationWidget::resize(QSize size)
{
setFixedSize(size);
}
WaitAnimationWidget::~WaitAnimationWidget() WaitAnimationWidget::~WaitAnimationWidget()
{ {
delete ui; delete ui;

View File

@@ -17,6 +17,7 @@ public:
void initialize(QMovie *movie,QWidget *parent); void initialize(QMovie *movie,QWidget *parent);
void showWithPlay(); void showWithPlay();
void hideWithStop(); void hideWithStop();
void resize(QSize size);
~WaitAnimationWidget(); ~WaitAnimationWidget();
private: private: