Ассоциируйте сигнал и слот с 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)));
}

1

Решение

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

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

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

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

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

Другие решения

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

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

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

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

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

1

От Документация Qt:

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

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

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

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

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

0
По вопросам рекламы [email protected]