Как переопределить сигнал в qt?

227
07 августа 2018, 09:00

У меня вопрос как переопределить сигнал в Qt?

Я переопределил QCheckBox() и изменил сигнал stateChanged.

Проект собирается и работает. При этом не выводит в "выводе приложения" ошибок либо сообщений типа "сигнал с слотом не связался"

НО не связывает с слотом. Не могу понять что не так.

Вот так работает :

 connect(test_checkbox[i], SIGNAL(stateChanged(int)), two_cl , SLOT(run_NEW()));// от кого, "реакция", кому, "выполнение"

Хочу доработать, чтобы еще строку, сигнал оправлял :

connect(test_checkbox[i], SIGNAL(stateChanged(int, QString)), two_cl , SLOT(run_NEW(int, QString))); // от кого, "реакция", кому, "выполнение"

переопределение QCheckBox-а

.h

#ifndef MYDIMASCHECKBOX_H
#define MYDIMASCHECKBOX_H
#include <QCheckBox>
class MyDimasCheckBox : public QCheckBox
{
    Q_OBJECT
public:
    MyDimasCheckBox(QWidget *parent =0);
    ~MyDimasCheckBox();
    QString stroka;
signals:
    void stateChanged(int, QString);
};
#endif // MYDIMASCHECKBOX_H

.cpp

#include "mydimascheckbox.h"
MyDimasCheckBox::MyDimasCheckBox(QWidget *parent)
{
    stroka = "dimasik :3";
    emit stateChanged(int(), stroka);
}
MyDimasCheckBox::~MyDimasCheckBox()
{
}

А вот где вызываю

.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <QCheckBox>
#include <QHBoxLayout>
#include <QDebug>
#include <QThread>
#include <QCoreApplication>
#include <iostream>
#include <vector>
#include "mydimascheckbox.h"
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
    Q_OBJECT
    int glob_i ;
    int glob_flow;
    int vector_schet; // датчик счёта
public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();
public slots:
    void start_sending(bool); // принажатии на чекбокс то выполниться этот слот (отправка сообщений)
private slots:
    void on_pushButton_clicked();
private:
    Ui::MainWindow *ui;
    QThread *thread = new QThread();
    QVector<QThread*> vector_thread;
    QList<MyDimasCheckBox*> test_checkbox;  // 16/08
    MyDimasCheckBox *checkBox = new MyDimasCheckBox();      // объявляем и инициализируем чекбокс через новый класс
    // Создаём виджет, который будет содержать в себе чекбокс
    QWidget *checkBoxWidget = new QWidget();
    // создаём слой с привязкой к виджету
    QHBoxLayout *layoutCheckBox = new QHBoxLayout(checkBoxWidget);
};
class NewsThread: public QThread
{
    Q_OBJECT
public slots:
    void run_NEW(); // код выполняемый в потоке
    void run_NEW(int, QString); // код выполняемый в потоке
signals:
    void otprawka (int);
};
#endif // MAINWINDOW_H

.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    glob_i=0;
    glob_flow =0;
    vector_schet =0;

    ui->setupUi(this);
}
MainWindow::~MainWindow()
{
    delete ui;
    test_checkbox.clear();
}
void MainWindow::on_pushButton_clicked()
{
    glob_i++;
    //-- добавляем чек бокс в таблицу
    checkBoxWidget = new QWidget(); // создаём новый qwidget()
    checkBox = new MyDimasCheckBox();      // объявляем и инициализируем чекбокс
    layoutCheckBox = new QHBoxLayout(checkBoxWidget); // создаём слой с привязкой к виджету
    test_checkbox.append(checkBox);
    connect(checkBox, SIGNAL(toggled(bool)),this, SLOT(start_sending(bool))); // соединение всех чекетов с "действием"  start_sending
    checkBox->setText(QString::number(glob_i));
    layoutCheckBox->addWidget(checkBox);            // Устанавливаем чекбокс в слой
    layoutCheckBox->setAlignment(Qt::AlignCenter);  // Отцентровываем чекбокс
    layoutCheckBox->setContentsMargins(0,0,0,0);    // Устанавливаем нулевые отступы
    ui->tW_test->insertRow(ui->tW_test->rowCount());//вводим колич строк (возвращ колич строк)
    ui->tW_test->setCellWidget(ui->tW_test->rowCount()-1, 1,  checkBoxWidget); // добавляем элемент в таблицу (строка, столбец, добавляемый элемент)
    qDebug() << "glob_i: " << glob_i;
}
void MainWindow::start_sending(bool Value)
{
    qDebug() << "start_sending  "  ;
    // когда нажата отрабатывает, отжата то не отрабатывает
    if (Value == true)
    {
        NewsThread *two_cl = new NewsThread(); // инициализируем второй класс
        qDebug() << "chekbocks: "<< " TRUE" ;
        for (int i =0;i < test_checkbox.length();i++ )
        {
            if(test_checkbox[i]->isChecked() ==Value)
            {
                glob_flow++;
//                connect(test_checkbox[i], SIGNAL(stateChanged(int)), two_cl , SLOT(run_NEW()));// от кого, "реакция", кому, "выполнение"
                connect(test_checkbox[i], SIGNAL(stateChanged(int, QString)), two_cl , SLOT(run_NEW(int, QString))); // от кого, "реакция", кому, "выполнение"

                thread = new QThread(); // инициализ класс потока из за того что
                vector_thread.append(thread);
                vector_schet++;
                qDebug() << "vector_schet : " << vector_schet ;
                two_cl->moveToThread(vector_thread[vector_schet-1]); // отправляем в поток
                vector_thread[vector_schet-1]->start(); // цикл обработки сообщения в потоке (второй поток)
            }
        }
    }
    else {
        qDebug() << "chekbocks:" << " False";
        glob_flow--;
        qDebug() << "vector_schet : " << vector_schet ;
        vector_thread[vector_schet-1]->exit();
    }
}
void NewsThread::run_NEW()
{
    qDebug() << "run_NEW()";
    for(;;){ // вечный цикл
        for (int i=0; i<500; i++){
            qDebug()<< "Число :" << i <<"номер \"потока\" :"  ;
            usleep(100000);
        }
    }
}
void NewsThread::run_NEW(int i, QString str){
    qDebug() << "run_NEW(int i, QString str) ";
    for(;;){ // вечный цикл
        for (int i=0; i<500; i++){
            qDebug() << " i : " << i;
            qDebug() << " str : " << str;
            qDebug()<< "Число :" << i <<"номер \"потока\" :"  ;
            usleep(100000);
        }
    }
}
Answer 1

Ответ находиться по ссылке

Но так как я приверженец своей культуры я его выложу здесь переведенный ответ.(еще там мои поправки удалили и теперь он более тяжёл для понимания)

Перегрузить сигнал не получиться но можно направить сигнал на слот в котором будет лежать иной сигнал от другого коннекта к другому слоту. Для этого потребуется добавить в код один коннект.

В классе переопределения QCheckBox-а .h

class MyDimasCheckBox : public QCheckBox
{
    Q_OBJECT
public:
    MyDimasCheckBox(QWidget *parent =0);
    ~MyDimasCheckBox();
    QString stroka;
private slots:
    // Создаём новый сигнал
    void doEmitStateChanged(int i);
signals:
    void stateChanged(int, QString);
};

.cpp

#include "mydimascheckbox.h"
MyDimasCheckBox::MyDimasCheckBox(QWidget *parent) : QCheckBox(parent) {
    // Connect original signal to slot
       connect(this, SIGNAL(stateChanged(int)), this, SLOT(doEmitStateChanged(int)));
}
MyDimasCheckBox::~MyDimasCheckBox()
{
}
void MyDimasCheckBox::doEmitStateChanged(int i) {
    stroka = "dimasik :3";
    emit stateChanged(i, stroka);
}

А там где вызываю, заменяю код с:

  //             connect(test_checkbox[i], SIGNAL(stateChanged(int)), two_cl , SLOT(run_NEW()));// от кого, "реакция", кому, "выполнение"
  connect(test_checkbox[i], SIGNAL(stateChanged(int, QString)), two_cl , SLOT(run_NEW(int, QString))); // от кого, "реакция", кому, "выполнение"

на:

 connect(test_checkbox[i], SIGNAL(stateChanged(int, QString)), two_cl , SLOT(run_NEW(int, QString))); 
READ ALSO
Не выполняется служба

Не выполняется служба

Когда запускаешь просто exe, все работаетКогда запускаешь службу, пишет только первую часть, цикл while (!pRstAuthors->EndOfFile) не выполняется

161
mariadb jdbc не работает - No suitable driver found for jdbc:mariadb://localhost:3306/statsDB

mariadb jdbc не работает - No suitable driver found for jdbc:mariadb://localhost:3306/statsDB

Пытаюсь подключиться к mariadb через jbdc отсюда: https://mariadbcom/kb/en/library/about-mariadb-connector-j/

216
Как сделать первую букву в строке жирной? - Android

Как сделать первую букву в строке жирной? - Android

Пытался через HtmlfromHtml, но не получается

139
Как сравнить String и Set&lt;String&gt;

Как сравнить String и Set<String>

Через Scanner ввожу любой текст, получается строка:

208