Страницы

Поиск по вопросам

Показаны сообщения с ярлыком сигналы-слоты. Показать все сообщения
Показаны сообщения с ярлыком сигналы-слоты. Показать все сообщения

суббота, 4 января 2020 г.

Передача данных в слот не работает (через метод connect)

#cpp #qt5 #сигналы_слоты


Есть вот такой код:


  test.h


class test : public QObject{
    Q_OBJECT
private:
...............................................
public:
    test();
public slots:
    void txt();
signals:
    void ok();
};



  test.cpp


test::test(){
................................................
    connect(p, SIGNAL(clicked()), SIGNAL(ok()));
}

void test::txt(){
    l->setText("ok");
}



  main.cpp


....................................................
test a, b;

QObject::connect(&a, SIGNAL(ok()), &b, SLOT(txt()));
QObject::connect(&b, SIGNAL(ok()), &a, SLOT(txt()));
....................................................


Работает он замечательно. Но стоит добавить параметры передачи значений в слот как
код перестает работать. Вот пример:


  test.h


class test : public QObject{
    Q_OBJECT
private:
................................................
public:
    test();
public slots:
    void txt(QString);
signals:
    void ok(QString);
};



  test.cpp


test::test(){
......................................................
    connect(p, SIGNAL(clicked()), SIGNAL(ok("word")));
}

void test::txt(QString s){
    l->setText("ok");
}



  main.cpp


....................................................
test a, b;

QObject::connect(&a, SIGNAL(ok()), &b, SLOT(txt()));
QObject::connect(&b, SIGNAL(ok()), &a, SLOT(txt()));
....................................................


Этот код собирается но слот не отрабатывает, и почему то в редакторе строка:

connect(p, SIGNAL(clicked()), SIGNAL(ok("word")));


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


Ответы

Ответ 1



Ответ kff из комментария: В connect нельзя задавать параметры слота. Параметр должен приходить из сигнала Дополню, что если сигнатура сигнала и слота не совпадает, либо необходимо выполнить дополнительные действия, то можно использовать новый синтаксис соединения сигналов и слотов, появившийся в Qt5, и lambda-выражения: QObject::connect(p, &QPushButton::clicked, this, [this]() { Q_EMIT ok("word"); });

понедельник, 16 декабря 2019 г.

Сигналы и слоты Qt как в них ориентироваться?

#cpp #qt #обработка_сигналов #сигналы_слоты #инструменты_разработчика


После того как мой проект начал разрастаться быстро отследить связи между сигналами
и слотами становится затруднительно. Есть ли какие нибудь рекомендации для того чтобы
удобно и быстро можно было отслеживать связи. На данный момент у меня только один вариант,
записывать все связи на бумаге и постоянно их сверять в процессе разработки.
    


Ответы

Ответ 1



Какие только возможно связи делать средствами дизайнера, чтобы не забивать ими исходники. Массовое создание связей выносить в отдельный метод. В этом методе группировать создание связей по источникам. Обязательно проверять, что connect возвращает TRUE. Использовать возможности C++11 для connect(), тогда проверка совместимости сигнала и слота будет происходить в момент компиляции. Пример для 5-го пункта: connect(sender, &Sender::valueChanged, receiver, &Receiver::updateValue ); Документация

вторник, 29 января 2019 г.

Передача данных в слот не работает (через метод connect)

Есть вот такой код:
test.h
class test : public QObject{ Q_OBJECT private: ............................................... public: test(); public slots: void txt(); signals: void ok(); };
test.cpp
test::test(){ ................................................ connect(p, SIGNAL(clicked()), SIGNAL(ok())); }
void test::txt(){ l->setText("ok"); }
main.cpp
.................................................... test a, b;
QObject::connect(&a, SIGNAL(ok()), &b, SLOT(txt())); QObject::connect(&b, SIGNAL(ok()), &a, SLOT(txt())); ....................................................
Работает он замечательно. Но стоит добавить параметры передачи значений в слот как код перестает работать. Вот пример:
test.h
class test : public QObject{ Q_OBJECT private: ................................................ public: test(); public slots: void txt(QString); signals: void ok(QString); };
test.cpp
test::test(){ ...................................................... connect(p, SIGNAL(clicked()), SIGNAL(ok("word"))); }
void test::txt(QString s){ l->setText("ok"); }
main.cpp
.................................................... test a, b;
QObject::connect(&a, SIGNAL(ok()), &b, SLOT(txt())); QObject::connect(&b, SIGNAL(ok()), &a, SLOT(txt())); ....................................................
Этот код собирается но слот не отрабатывает, и почему то в редакторе строка:
connect(p, SIGNAL(clicked()), SIGNAL(ok("word")));
подчеркивается красным но в консоли ошибок нет. В чем может быть причина?


Ответ

Ответ kff из комментария:
В connect нельзя задавать параметры слота. Параметр должен приходить из сигнала
Дополню, что если сигнатура сигнала и слота не совпадает, либо необходимо выполнить дополнительные действия, то можно использовать новый синтаксис соединения сигналов и слотов, появившийся в Qt5, и lambda-выражения:
QObject::connect(p, &QPushButton::clicked, this, [this]() { Q_EMIT ok("word"); });

суббота, 27 октября 2018 г.

Сигналы и слоты Qt как в них ориентироваться?

После того как мой проект начал разрастаться быстро отследить связи между сигналами и слотами становится затруднительно. Есть ли какие нибудь рекомендации для того чтобы удобно и быстро можно было отслеживать связи. На данный момент у меня только один вариант, записывать все связи на бумаге и постоянно их сверять в процессе разработки.


Ответ

Какие только возможно связи делать средствами дизайнера, чтобы не забивать ими исходники. Массовое создание связей выносить в отдельный метод. В этом методе группировать создание связей по источникам. Обязательно проверять, что connect возвращает TRUE Использовать возможности C++11 для connect(), тогда проверка совместимости сигнала и слота будет происходить в момент компиляции.
Пример для 5-го пункта:
connect(sender, &Sender::valueChanged, receiver, &Receiver::updateValue );
Документация