2010-11-11 1 views
14

Я не могу передать аргумент слоту. Если я не передаю аргумент, функция прокручивается через штраф. Если я передаю аргумент (целое число), я получаю ошибки «Нет такого типа имени» и «Нет такого слота» при компиляции.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 

} 

ответ

17

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

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

+1

ах, похоже, что это сработает. благодаря! – 2010-11-11 23:53:22

8

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

+0

Отредактирован код выше, чтобы отразить то, что я пробовал (на примере, который я нашел), но все еще не работает. – 2010-11-11 23:47:00

+0

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

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 «s базового класса QAbstractButton.)

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

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

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

+0

Я удивлен, что ваш единственный ответ, который упоминает ошибку аргумента, где имя переменной передается в SIGNAL и SLOT в вызове connect; код образца никогда не будет компилироваться, если «count» не является типом. – pixelgrease

 Смежные вопросы

  • Нет связанных вопросов^_^