Ассоциируйте сигнал и слот с qcheckbox, создавайте динамически

У меня очень специфическая проблема, поэтому я постараюсь быть максимально понятным.

у меня есть QTabWidget который содержит QTableWidgetкаждая строка моего QTableWidget это создать динамически, читая файл.

myTab

Как вы можете видеть, когда я создаю строку, я добавляю qCheckBox в конце. Моя цель сейчас - отправить эту строку QTableWidget в последней вкладке моего QtableTab когда я нажимаю на qCheckBox (и удалить эту строку, когда я снимаю qCheckBox).

Поэтому каждый раз, когда я создаю линию динамически, я пытаюсь связать с моим qCheckBox сигнал:

QObject::connect(pCheckBox, SIGNAL(clicked()),  this, SLOT(cliqueCheckBox(monTab,ligne, pCheckBox)));

Но это не сработает, у меня ошибка:

QObject::connect: No such slot supervision::cliqueCheckBox(monTab,ligne, pCheckBox)

Но этот слот существует, я объявляю его в моем заголовочном файле и моем cpp следующим образом:

void supervision::cliqueCheckBox(QTableWidget *monTab, int ligne, QCheckBox *pCheckBox)

Насколько хорош мой способ решения этой проблемы? Если да, как правильно связать сигнал со слотом, и если нет, как действовать?

Спасибо.

[РЕДАКТИРОВАТЬ]: Вот код моей функции создания qCheckBox и связал это динамически:

void supervision::ajouterCheckBox(QTableWidget *monTab, int ligne){
    // Creation de la check box
    QWidget *pWidget = new QWidget(); //Creation du widget contenant la checkbox
    QCheckBox *pCheckBox = new QCheckBox(); // Creation de la checkbox
    QHBoxLayout *pLayout = new QHBoxLayout(pWidget); // Layout pour centrer ma checkbox
    pLayout->addWidget(pCheckBox); // Ajout de la check box au layout
    pLayout->setAlignment(Qt::AlignCenter); //Alignement
    pLayout->setContentsMargins(0,0,0,0);//Supression des bordure
    pWidget->setLayout(pLayout);//Mise en place du layout dans le widget
    monTab->setCellWidget(ligne,5,pWidget);//Mise en place du widget contenant la checkbox dans ça cellule

    //Mise en place de la connection
    QObject::connect(pCheckBox, SIGNAL(clicked()),  this, SLOT(cliqueCheckBox(monTab,ligne, pCheckBox)));
}

3 ответа

Решение

Вы подключаетесь SIGNAL(clicked()) в SLOT(cliqueCheckBox(monTab,ligne, pCheckBox) который недействителен. Аргументы сигнала и слота должны совпадать. Здесь вы не указываете какие-либо параметры для целевого слота.

Правильная форма:

QObject::connect(pCheckBox, SIGNAL(clicked()),  this, SLOT(clickedCheckBox()));

А также clickedCheckBox Слот должен иметь доступ к указателям ваших виджетов:

void myClass::clickedCheckBox()
{
   ...
}

На самом деле, у вас есть проблема в вашей связи.

Действительно, вы подключаете сигнал с нулевыми параметрами к слоту, который принимает три параметра, и это не сработает.

Когда вы подключаете сигнал к слоту, сигнатуры должны совпадать (или слот должен принимать меньше аргументов), иначе вы получите ошибку во время выполнения. Действительно, в вашем случае слот ожидает аргументы, которые сигнал не отправит.

Таким образом, вы должны найти способ, чтобы ваши подписи совпадали.

РЕДАКТИРОВАТЬ: Что касается кода, который вы добавили, нет, вы не можете использовать переменные, присутствующие в области, где вы объявляете соединение в качестве параметров. Аргумент слота может исходить только из соответствующего сигнала (сигналов).

Из документации Qt:

Все классы, которые содержат сигналы или слоты, должны упомянуть Q_OBJECT в начале своего объявления. Они также должны происходить (прямо или косвенно) из QObject.

class X : public QObject 
{ 
    Q_OBJECT
    ...
};

Вы должны объявить слоты в вашем объявлении класса:

public slots:
    void cliqueCheckBox(QTableWidget *monTab, int ligne, QCheckBox *pCheckBox);

Правило о том, включать или не включать аргументы в макросы SIGNAL() и SLOT(), если аргументы имеют значения по умолчанию, заключается в том, что подпись, передаваемая в макрос SIGNAL(), не должна иметь меньше аргументов, чем подпись, передаваемая в SLOT. () макрос

Другие вопросы по тегам