Подключите сигнал и слот из разных потоков и класса - PullRequest
0 голосов
/ 28 марта 2020

Я программирую приложение с пользовательским интерфейсом. Этот интерфейс имеет пару объектов LideEdit и проверяемый GroupBox, все они содержатся в классе MainWindow. Когда пользователь изменяет состояние проверяемого GroupBox, он излучает сигнал с именем system_toogled(int, int, std::string).

. Поэтому класс MainWindow имеет следующее определение:

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

private slots:
    void on_groupBox_toggled(bool arg1);

signals:
    void system_toogled(int, int, std::string);

private:
    Ui::MainWindow *ui;
};

. Сигнал system_toogled(int, int, std::string) излучается. в on_groupBox_toggled(bool arg1), который имеет следующее определение:

void MainWindow::on_groupBox_toggled(bool arg1)
{
        emit system_toggled(ui->lineEdit->text().toInt(),
                            ui->lineEdit_2->text().toInt(),
                            ui->lineEdit_3->text().toStdString())
}

У меня также есть класс myProgramThread, производный от класса QThread. Он имеет следующее определение:

class myProgramThread : public QThread
{
    Q_OBJECT

public:
    myProgramThread(MainWindow* mainWindow);

public slots:
    void on_system_toggled(int, int, std::string);

protected:
    void run();
};

Публичный c слот под названием: on_system_toogled(int, int, std::string) управляет этими переменными. Я попытался соединить сигнал и слот publi c с функцией: connect() внутри конструктора класса myProgramThread, который имеет следующее определение:

myProgramThread::myProgramThread(MainWindow* mainWindow)
{
    connect(mainWindow, SIGNAL(system_toggled(int, int, std::string)), this, SLOT(on_system_toggled(int, int, std::string)));
}

Не работает. Я продолжаю получать следующий вывод приложения во время отладки:

QMetaObject :: connectSlotsByName: нет соответствующего сигнала для on_system_toogled (int, int, std :: string)

Так что мой вопрос: как я могу подключить сигнал от класса MainWindow к слоту другого потока?

1 Ответ

0 голосов
/ 28 марта 2020

Откуда ты знаешь, что это не работает? Вы проверяли возвращаемое значение функции connect ()? То, что вы видите, связано с каким-то вводящим в заблуждение наименованием вашего слота, которое вызывает функцию autoconnect в Qt.

...