qt4::Передача параметра в слот

Модератор: Модераторы разделов

Аватара пользователя
Voral
Сообщения: 1205
ОС: Debian Wheezy (amd64)

qt4::Передача параметра в слот

Сообщение Voral »

Хочу сделать слот работающий в зависимости от входного параметра в заголовочном файле:

Код: Выделить всё

...
    private slots:
        bool connecting(bool asServer = false);
    private:
...
        QAction *aConnectClient;
        QAction *aConnectServer;
...

дальше при инициализации окна

Код: Выделить всё

    aConnectServer = new QAction(tr("Start as &Server"), this);
    aConnectServer->setStatusTip(tr("Start in server mode"));
    connect(aConnectServer, SIGNAL(triggered()), this, SLOT(connecting(true)));
    aConnectClient = new QAction(tr("Start as &Client"), this);
    aConnectClient->setStatusTip(tr("Start in client mode"));
    connect(aConnectClient, SIGNAL(triggered()), this, SLOT(connecting()));

компилирую. все ок.
запускаю. запускается но в консоль выдает:
Object::connect: No such slot VMainWindow::connecting(bool asServer=true)


Разъясните, пожалуйста, ситуацию. Почему так и как ее решить.
То что не убивает нас, делает нас сильнее! © Ницше.
When life puts you in tough situations, don’t say "why me". Just say "try me © ?
Спасибо сказали:
Аватара пользователя
nuclear
Сообщения: 68
ОС: Ubuntu

Re: qt4::Передача параметра в слот

Сообщение nuclear »

bool connecting(bool asServer = false);
Тут не должно быть значения по-умолчанию.
ЗЫ если бред то извиняйте.
Спасибо сказали:
Аватара пользователя
Voral
Сообщения: 1205
ОС: Debian Wheezy (amd64)

Re: qt4::Передача параметра в слот

Сообщение Voral »

nuclear писал(а):
01.10.2009 16:26
bool connecting(bool asServer = false);
Тут не должно быть значения по-умолчанию.

Хм. Убрал значение по умолчанию. Ошибка осталась....
То что не убивает нас, делает нас сильнее! © Ницше.
When life puts you in tough situations, don’t say "why me". Just say "try me © ?
Спасибо сказали:
NickLion
Сообщения: 3408
Статус: аватар-невидимка
ОС: openSUSE Tumbleweed x86_64

Re: qt4::Передача параметра в слот

Сообщение NickLion »

Вот здесь

Код: Выделить всё

connect(aConnectServer, SIGNAL(triggered()), this, SLOT(connecting(true)));

Не надо значение указывать.

Код: Выделить всё

connect(aConnectServer, SIGNAL(triggered()), this, SLOT(connecting()));

Или тип можно

Код: Выделить всё

connect(aConnectServer, SIGNAL(triggered()), this, SLOT(connecting(bool)));
Спасибо сказали:
Аватара пользователя
Voral
Сообщения: 1205
ОС: Debian Wheezy (amd64)

Re: qt4::Передача параметра в слот

Сообщение Voral »

NickLion писал(а):
01.10.2009 22:21
Не надо значение указывать.


Т.е. здесь передавать параметры нельзя (мне именно это нужно)?
Т.е. для решения соей проблемы я должен назначить два слота. При этом второй будет просто вызывать первую функцию но с параметром?
примерно так:

Код: Выделить всё

...
    private slots:
        bool connecting(bool asServer = false);
        bool connectingSrv();
    private:
...
        QAction *aConnectClient;
        QAction *aConnectServer;
...

.....
aConnectServer = new QAction(tr("Start as &Server"), this);
aConnectServer->setStatusTip(tr("Start in server mode"));
connect(aConnectServer, SIGNAL(triggered()), this, SLOT(connectingSrv()));
aConnectClient = new QAction(tr("Start as &Client"), this);
aConnectClient->setStatusTip(tr("Start in client mode"));
connect(aConnectClient, SIGNAL(triggered()), this, SLOT(connecting()));
......


...
bool VMainWidow::connectingSrv(){
     connecting(true);
}
...


если же делать как в этой строке:

Код: Выделить всё

connect(aConnectServer, SIGNAL(triggered()), this, SLOT(connecting(bool)));


Как передать конкретно значение true?
То что не убивает нас, делает нас сильнее! © Ницше.
When life puts you in tough situations, don’t say "why me". Just say "try me © ?
Спасибо сказали:
Аватара пользователя
destr
Сообщения: 128
ОС: Debian

Re: qt4::Передача параметра в слот

Сообщение destr »

Вам всегда будет выдаваться ошибка в этом случае, потому что у сингала нет параметра, у слота есть, несоответствие сигнал-слот.
Сделать можно следующим образом:
Создать производный класс который шлёт сигнал triggered(bool)
подключить this (потомка) к triggered() к слоту который будет посылать triggered(bool);
И соответственно подключать производный класс.

Код: Выделить всё

class MyQAction : public QAction
{
    bool m_state;
    Q_OBJECT
    public:
        MyQAction(...)
        {
            connect(this, SIGNAL(triggered()), SLOT(my_triggred()));
        }

    public slots:
        void my_triggered()
        {
            emit triggered(m_state);
        }
    signals:
        void triggered(bool);
};

// и где-то там
...
MyQAction *a = new MyQAction(...);

connect(a, SIGNAL(triggered(bool)), SLOT(slot_with_param(bool)));


Идея такая, я просто не очень понял где переменная, которую надо передать.

У QObject ещё есть метод sender() который protected, в общем зависит он задачи. и ещё, кстати есть QCustomEvent.
Спасибо сказали:
Аватара пользователя
Voral
Сообщения: 1205
ОС: Debian Wheezy (amd64)

Re: qt4::Передача параметра в слот

Сообщение Voral »

так. вчитался. в слоте не может быть больше параметров чем в сигнале... Если я все правильно понял.

Решил ситуацию именно дополнительным слотом. Пожалуй так код даже красивее будет (разнес именно код).

Тем не менее интерес остался. Возможно ли решить данную задачу. Знает ли сигнал или слот в конкретной паре кто послал сигнал?

Размышления вслух:
Как я понял слот, в принципе, может принадлежать хоть другому приложению. Т.е. доступ к объекту-источнику сигнала может быть закрыт. Но ведь, сигнал может знать кто его послал?
Перебить функцию-сигнал?



destr писал(а):
01.10.2009 22:42
Сделать можно следующим образом:
Идея такая, я просто не очень понял где переменная, которую надо передать.


Ого я 18 минут писал сообщение...

Спасибо за подсказку.
То что не убивает нас, делает нас сильнее! © Ницше.
When life puts you in tough situations, don’t say "why me". Just say "try me © ?
Спасибо сказали:
Аватара пользователя
destr
Сообщения: 128
ОС: Debian

Re: qt4::Передача параметра в слот

Сообщение destr »

По поводу того, что можно послать другому приложению этого я не знаю, первый раз слышу. А по поводу кто послал сигнал есть метод sender() я просто глянул на QObject, что он у него protected, в QWidget то он доступен, вот и делайте dynamic_cast от QObject, но надо хотя бы знать от кого сигнал, его можно узнать по className() методу (если он может прийти от нескольких объектов), который генерируется автоматом moc компилятором
Спасибо сказали:
Аватара пользователя
Crazy
Сообщения: 862
Статус: Адепт Дзен.
ОС: Mint, Win7.

Re: qt4::Передача параметра в слот

Сообщение Crazy »

Чем QObject::sender() не устраивает, может еще пригодится QSignalMapper.

Desipere in loco
Спасибо сказали:
Аватара пользователя
Denjs
Сообщения: 1685
ОС: SuSe 10.2

Re: qt4::Передача параметра в слот

Сообщение Denjs »

на уровне флуда:
можно вопрос:
а с фига лысого почему вы слот в секции
private определяете? разве вы не хотите к нему коннектиться из других классов объектов?
у меня завсегда все слоты в public определены...
QDroid - Среда исполнения и фреймворк для QtScript.
OTPD - Открытые драйвера промышленных принтеров чеков и этикеток (кроссплатформенная подсистема печати).
Спасибо сказали: