Guest User

Qt Task Tree in action

a guest
Mar 9th, 2026
222
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.73 KB | Software | 0 0
  1. #include <QApplication>
  2. #include <QList>
  3. #include <QMainWindow>
  4. #include <QtTaskTree/QSingleTaskTreeRunner>
  5.  
  6. #include <QPushButton>
  7. #include <QSpinBox>
  8. #include <QVBoxLayout>
  9. #include <QFormLayout>
  10. #include <QScrollArea>
  11. #include <QHBoxLayout>
  12. #include <QTextEdit>
  13.  
  14. using namespace QtTaskTree;
  15.  
  16. using namespace std::chrono;
  17.  
  18. class TaskData
  19. {
  20. public:
  21.     int id = 0;
  22.     int length = 1;
  23. };
  24.  
  25. class TaskList
  26. {
  27. public:
  28.     QString addTask(int id, int length)
  29.     {
  30.         auto it = std::find_if(m_tasks.begin(), m_tasks.end(), [id](const TaskData &data) {
  31.             return data.id == id;
  32.         });
  33.  
  34.         if (it == m_tasks.end()) {
  35.             m_tasks.append({id, length});
  36.             return QString("Task created: %1 / %2").arg(id).arg(length);
  37.         }
  38.  
  39.         if (it->length != length) {
  40.             it->length = length;
  41.             return QString("Task %1 updated").arg(id);
  42.         }
  43.  
  44.         return "Nothing to do";
  45.     }
  46.  
  47.     QString removeTask(int id)
  48.     {
  49.         const auto it = std::find_if(m_tasks.begin(), m_tasks.end(), [id](const TaskData &data) {
  50.             return data.id == id;
  51.         });
  52.  
  53.         if (it == m_tasks.end())
  54.             return "Nothing to do";
  55.  
  56.         m_tasks.erase(it);
  57.         return QString("Task %1 removed").arg(id);
  58.     }
  59.  
  60.     QList<TaskData> tasks() const { return m_tasks; }
  61.  
  62. private:
  63.     QList<TaskData> m_tasks;
  64. };
  65.  
  66. static ExecutableItem recipe(const TaskList &taskList)
  67. {
  68.     const ListIterator<TaskData> iterator(taskList.tasks());
  69.  
  70.     const auto onSetup = [iterator](milliseconds &duration) {
  71.         duration = seconds(iterator->length);
  72.         qDebug() << iterator->id << "started.";
  73.     };
  74.     const auto onDone = [iterator] {
  75.         qDebug() << iterator->id << "finished.";
  76.     };
  77.  
  78.     return Forever {
  79.         For(iterator) >> Do {
  80.             QTimeoutTask(onSetup, onDone)
  81.         },
  82.         QSyncTask([] { qDebug() << "Reaching end. Restarting..."; })
  83.     };
  84. }
  85.  
  86. class MainWindow : public QMainWindow
  87. {
  88. public:
  89.     MainWindow(QWidget *parent = nullptr);
  90.  
  91. private:
  92.     TaskList m_taskList;
  93.     QSingleTaskTreeRunner m_taskTreeRunner;
  94. };
  95.  
  96. MainWindow::MainWindow(QWidget *parent)
  97.     : QMainWindow(parent)
  98. {
  99.     QWidget *cntrwdg = new QWidget;
  100.     QVBoxLayout *vbox = new QVBoxLayout;
  101.     QPushButton *btn_add = new QPushButton("Add / Update", this);
  102.     QPushButton *btn_rem = new QPushButton("Delete", this);
  103.     QPushButton *btn_print = new QPushButton("Print", this);
  104.  
  105.     QHBoxLayout *hbox = new QHBoxLayout;
  106.     QPushButton *btn_start = new QPushButton("Start", this);
  107.     QPushButton *btn_stop = new QPushButton("Stop", this);
  108.     hbox->addWidget(btn_start);
  109.     hbox->addWidget(btn_stop);
  110.  
  111.     QSpinBox *spin_seq = new QSpinBox(this);
  112.     spin_seq->setRange(0, 999);
  113.     QSpinBox *spin_seqLen = new QSpinBox(this);
  114.     spin_seqLen->setRange(1, 999);
  115.  
  116.     QTextEdit *textEdit = new QTextEdit(this);
  117.  
  118.     QFormLayout *laySeq = new QFormLayout;
  119.     QFormLayout *layseqLen = new QFormLayout;
  120.  
  121.     laySeq->addRow("Task ID\t\t", spin_seq);
  122.     layseqLen->addRow("Sub-Task Length\t", spin_seqLen);
  123.  
  124.     vbox->addLayout(laySeq);
  125.     vbox->addLayout(layseqLen);
  126.  
  127.     vbox->addWidget(btn_add);
  128.     vbox->addWidget(btn_rem);
  129.     vbox->addWidget(btn_print);
  130.     vbox->addWidget(textEdit);
  131.     vbox->addLayout(hbox);
  132.     cntrwdg->setLayout(vbox);
  133.  
  134.     connect(btn_add, &QPushButton::clicked, this, [=] {
  135.         textEdit->append(m_taskList.addTask(spin_seq->value(), spin_seqLen->value()));
  136.     });
  137.  
  138.     connect(btn_rem, &QPushButton::clicked, this, [=] {
  139.         textEdit->append(m_taskList.removeTask(spin_seq->value()));
  140.     });
  141.  
  142.     connect(btn_print, &QPushButton::clicked, this, [=] {
  143.         QString msg = "\n#####\tID ####\tLEN ###############\n";
  144.         const QList<TaskData> tasks = m_taskList.tasks();
  145.         for (const TaskData &task : tasks)
  146.             msg += "Task:\t" + QString::number(task.id) + "\t" + QString::number(task.length) + "\n";
  147.         msg += "#########################################\n";
  148.         textEdit->append(msg);
  149.     });
  150.  
  151.     connect(btn_start, &QPushButton::clicked, this, [=] {
  152.         // Assume each sub-task takes 1s to finish
  153.         // just for simulation purpose
  154.         m_taskTreeRunner.start({recipe(m_taskList)});
  155.         btn_add->setEnabled(false);
  156.         btn_rem->setEnabled(false);
  157.     });
  158.  
  159.     connect(btn_stop, &QPushButton::clicked, this, [=] {
  160.         m_taskTreeRunner.reset();
  161.         btn_add->setEnabled(true);
  162.         btn_rem->setEnabled(true);
  163.     });
  164.  
  165.     setCentralWidget(cntrwdg);
  166.  
  167.     setGeometry(800, 400, 600, 300);
  168. }
  169.  
  170. int main(int argc, char *argv[])
  171. {
  172.     QApplication a(argc, argv);
  173.     MainWindow w;
  174.     w.show();
  175.     return a.exec();
  176. }
  177.  
Advertisement
Add Comment
Please, Sign In to add comment