Qt выдаёт аргументы в слот

Я не могу передать аргумент слоту. Если я не передаю аргумент, функция прокручивается через штраф. Если я передаю аргумент (целое число), я получаю ошибки "Нет такого типа имени" и "Нет такого слота" при компиляции.

В моем заголовке я объявляю:

private slots:
void addButton(int);
signals:
void clicked(int)

в моем Main.cpp, я делаю:

int count;
int count = 0;
QPushButton* button = new QPushButton("Button");
_layout->addWidget(button);
connect(button, SIGNAL(clicked(count), this, SLOT(addButton(count)));

....

void Main::addButton(int count) {

//do stuff with count

}

Ответы

Ответ 1

Себастьян прав, что вы не можете сделать это так, как вы пытаетесь, однако Qt предоставляет класс, который дает вам необходимую функциональность.

Просмотрите QSignalMapper. Он позволяет связать целое число с парой объект/сигнал. Затем вы подключаетесь к своим сигналам, а не непосредственно к кнопке.

Ответ 2

Сигнал и слот должны иметь одинаковый номер и тип аргумента (ов), и вы можете передавать только аргументы (сигналы) сигнала в слот, а не любую переменную или значение, которое вы хотите.

Ответ 3

Я вижу три проблемы с этим.

Во-первых, сигнал clicked() испускается QPushButton (без параметров), но вы пытаетесь переопределить его в своем собственном классе (с параметром int). Если вы хотите сделать это:

SignalClass* objectWithSignals = new SignalClass;
SlotClass* objectWithSlots = new SlotClass;
connect(objectWithSignals, SIGNAL(a()), objectWithSlots, SLOT(b()));

то вы можете подключаться только к сигналам, уже определенным в SignalClass. Другими словами, сигнал a() должен принадлежать SignalClass, а не SlotClass.

(Фактически, clicked() определяется в QPushButton базовом классе QAbstractButton.)

Во-вторых, внутри функции connect() вам нужно указать сигнальные и слотовые сигнатуры с их параметром . Где у вас count внутри функции connect(), оно должно быть int.

И, в-третьих, в вашем вызове отсутствует скобка: SIGNAL(clicked(count)).

Надеюсь, что это поможет.