Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: Mish_ka от Апрель 07, 2011, 17:21



Название: Игнорирование SLOT'a
Отправлено: Mish_ka от Апрель 07, 2011, 17:21
Код
C++ (Qt)
favin = new QAction("name",this);
connect(favin, SIGNAL(triggered()), this, SLOT(openFav(silka)));
zakladkiMenu->addAction(favin);
 
void iTMan::openFav(QString silka)
{
this->uiIT.wvMain->setUrl(QUrl(silka));
}
 

при указании
Код
C++ (Qt)
SLOT(openFav(silka))
 

прога запускатся но функция не вызывается

а при вызове без аргумента
Код
C++ (Qt)
SLOT(openFav())
 

функция вызывается

в чём проблема?


Название: Re: Игнорирование SLOT'a
Отправлено: mutineer от Апрель 07, 2011, 17:23
Нельзя связывать сигнал со слотом, у которого больше параметров или не совпадают типы параметров


Название: Re: Игнорирование SLOT'a
Отправлено: Mish_ka от Апрель 07, 2011, 17:36
а как это сделать
пробывал

Код
C++ (Qt)
connect(favin, SIGNAL(triggered(silka)), this, SLOT(openFav(silka)));
 

тоже функция игнорируется


Название: Re: Игнорирование SLOT'a
Отправлено: mutineer от Апрель 07, 2011, 17:39
У слота triggered() нет параметров, поэтому связать ты его можешь только со слотом без параметров. Система не может вызвать слот, потому что нечего ему в параметр передать. Что ты ожидаешь увидеть значением silka?


Название: Re: Игнорирование SLOT'a
Отправлено: Mish_ka от Апрель 07, 2011, 17:45
верхний кусок кода сидит в цикле
из файла читается имя закладки, и ссылка куда она идёт
всё это компонуется в выпадающее меню.

ссылки разные я их хочу открывать через одну функцию, и не писать их 10 одинаковых

добавил, в функцию параметр silka = ссылка на которую нужно перебросить вебвьювер.


Название: Re: Игнорирование SLOT'a
Отправлено: mutineer от Апрель 07, 2011, 17:52
Идею понял, но не вижу где хранится адрес куда нужно перейти.

Могу дать такой совет:
Сделай наследника QAction, которому добавь поле адреса для перехода. Его сигнал triggered() соедини со слотом openFav(). В слоте вызови sender(), получишь ссылку на объект, пославший сигнал. Приведи его к твоему типу, вытащи из него адрес перехода и переходи


Название: Re: Игнорирование SLOT'a
Отправлено: mutineer от Апрель 07, 2011, 17:56
И советую внимательно прочитать про сигналы-слоты, ибо подозреваю что концепцию ты понял неправильно


Название: Re: Игнорирование SLOT'a
Отправлено: Mish_ka от Апрель 07, 2011, 17:59
адрес храниться в файле
при первом вызове и обработке цикла
получаем silka  - это QString'овая переменная которая и хранит адрес вида "main/index.html", я её как аргумент и передаю в функцию в которой её передаю вебвьюверу

Код
C++ (Qt)
this->uiIT.wvMain->setUrl(QUrl(silka));

было бы проще если бы можно было вызывать эту строчку из слота не используя функцию

Код
C++ (Qt)
connect(favin, SIGNAL(triggered()), this, SLOT(uiIT.wvMain->setUrl(QUrl(silka))));

скорее всего я это понимаю не правильно, читал, ещё раз читаю, но как видно ничего не понимаю


Название: Re: Игнорирование SLOT'a
Отправлено: mutineer от Апрель 07, 2011, 18:03
Цитировать
SLOT(uiIT.wvMain->setUrl(QUrl(silka)))

Видимо ты считаешь что тут происходит задание значения параметров. Но это не так. Тут ты просто указываешь какую функцию надо вызвать. А в скобках надо перечислять не значения параметров, с которыми функция будет вызвана, а типы параметров, которые она принимает.


Название: Re: Игнорирование SLOT'a
Отправлено: Mish_ka от Апрель 07, 2011, 18:08
а параметры тогда как передаются?


Название: Re: Игнорирование SLOT'a
Отправлено: mutineer от Апрель 07, 2011, 18:10
Параметры слот получает от вызвавшего его сигнала(если они у сигнала есть). Сигнал triggered() не передает никаких параметров, потому что значит только что действие активировано (параметров у этого события нет никаких)


Название: Re: Игнорирование SLOT'a
Отправлено: Mish_ka от Апрель 07, 2011, 18:13
а click() ?


Название: Re: Игнорирование SLOT'a
Отправлено: mutineer от Апрель 07, 2011, 18:14
Пустые скобочки намекают что у него тоже нет параметров. Я тебе выше рассказал как будет работать


Название: Re: Игнорирование SLOT'a
Отправлено: Mish_ka от Апрель 07, 2011, 18:16
ясно

а по верхнему я ничего не понял вобще =)


Название: Re: Игнорирование SLOT'a
Отправлено: mutineer от Апрель 07, 2011, 18:17
извиняюсь, введен твоим кодом в заблуждение. в документации сигнал выглядит как
Код:
void QAction::triggered ( bool checked = false )
и соответственно передает булевый параметр


Название: Re: Игнорирование SLOT'a
Отправлено: mutineer от Апрель 07, 2011, 18:22
создаешь класс GoAction, который наследуешь от QAction. У него будет поле с адресом.

И делаешь так:
Код:
favin = new GoAction("name",this);
favin->setAddress(silka);
connect(favin, SIGNAL(triggered(bool)), this, SLOT(openFav()));
zakladkiMenu->addAction(favin);

...

void iTMan::openFav()
{
      GoAction *Action = qobject_cast<GoAction*>(sender());
      if(Action)
this->uiIT.wvMain->setUrl(QUrl(Action->getAddress()));
}


Название: Re: Игнорирование SLOT'a
Отправлено: Mish_ka от Апрель 07, 2011, 20:06
спасибо!


Название: Re: Игнорирование SLOT'a
Отправлено: Igore от Апрель 08, 2011, 09:53
Не надо плодить классы, для этого случая есть QSignalMapper.