QT как передать Qlist классу Constructor - PullRequest
0 голосов
/ 13 января 2020

я пытаюсь передать Qlist конструктору класса, но безуспешно. Я могу передать основные переменные c, но с помощью Qlist получаю ошибку в редакторе

error: no matching constructor for initialization of 'Worker'

ошибка компилятора

error: no matching function for call to 'Worker::Worker(QList<MainWindow::MainWindow(QWidget*)::pnp_com_info>&)'
     Worker* worker = new Worker(pnp_data);

Вот что я делаю.

mainwindow. cpp

    MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
   {
        ui->setupUi(this);

       // my sample structure
       struct pnp_com_info{
          QString com_name = "";
          int x = 0;
          int y = 0;
          int angle = 0;
          bool status = false;
        };

    QList<pnp_com_info> pnp_data;  // Qlist container
    pnp_com_info pnp_component_data; // struct 

    // fill with data
    pnp_component_data.com_name = "e18";
    pnp_component_data.angle = 600;

    // add it to Qlist container
    pnp_data.append(pnp_component_data);

    //  Worker worker(5); // sample int passed OK.
    // try to pass Qlist to worker constructor 
    Worker* worker = new Worker(pnp_data);  // no success get error : no matching constructor for initialization of 'Worker'
}

работник. Исходный код

#ifndef WORKER_H
#define WORKER_H

#include <QObject>

class Worker : public QObject {
    Q_OBJECT
public:
           struct pnp_com_info{
              QString com_name = "";
              int x = 0;
              int y = 0;
              int angle = 0;
              bool status = false;
            };

   //   Worker(int sampleVar);
     Worker(QList<pnp_com_info> pnpData);
    ~Worker();
public slots:
    void doWork();
signals:
private:
     QList<pnp_com_info> pnp_components_data;
};
#endif // WORKER_H

работник. cpp

#include "worker.h"

// --- CONSTRUCTOR ---
 Worker::Worker(QList<pnp_com_info> pnp_data) {
//   Worker::Worker(int sampleVar) {
     this->pnp_components_data = pnp_data;

}

// --- DECONSTRUCTOR ---
Worker::~Worker() {
    // free resources
}
// --- PROCESS ---
// Start processing data.
void Worker::doWork() {
   // do some work
}

так что любая идея, что я делаю не так. спасибо

1 Ответ

2 голосов
/ 13 января 2020

В работнике. cpp вы не «внутри» области видимости класса. Таким образом, вам нужно полностью определить тип:

Worker::Worker(QList<Worker::pnp_com_info> pnp_data) {

И затем в MainWindow вам, конечно, нужно использовать ту же структуру Worker::pnp_com_info и не определять новый тип структуры.

Возможно, вы захотите поместить определение структуры где-то еще, кроме Worker. Но где, советовать невозможно, основываясь только на коде, который вы показываете; возможно, для этого лучше всего иметь вложенную структуру внутри Worker.


Лично мне нравится использовать Qt Creator (или любую IDE, которую я могу использовать для любого языка программирования), чтобы выполнить рефакторинг сгенерируйте определение метода в. cpp файле. Напишите объявление внутри th-класса в файле .h как обычно, затем щелкните его правой кнопкой мыши, чтобы получить контекстное меню, выберите рефакторинг и выберите нужный вариант генерации. Предотвращает подобные ошибки и может значительно сэкономить, если биться головой, особенно когда кодируешь, когда немного устал.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...