У меня очень специфическая проблема, поэтому я постараюсь быть максимально ясным.
у меня есть QTabWidget
который содержит QTableWidget
каждая строка моего QTableWidget
это создать динамически, читая файл.
Как вы можете видеть, когда я создаю строку, я добавляю 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)));
}
Вы подключаетесь 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. () макрос