crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

2 страниц V   1 2 >  
Тема закрытаНачать новую тему
> [РЕШЕНО] Как передать слоту параметр по ссылке ?
Diem
  опции профиля:
сообщение 10.3.2009, 15:32
Сообщение #1


Новичок


Группа: Новичок
Сообщений: 8
Регистрация: 10.3.2009
Пользователь №: 603

Спасибо сказали: 0 раз(а)




Репутация:   0  


Есть класс X для примера:
////////////////////// Файл x.h //////////////////////
#ifndef X_H
#define X_H
#include <QtDebug>
class X : public QObject
{
    Q_OBJECT
public:
    X(QObject *parent = 0);
public slots:
    void exampleSlot(QList<int> list);

signals:
    void exampleSignal(QList<int> list);
};
#endif // X_H

////////////////////// Файл x.cpp //////////////////////
#include"x.h"
X::X(QObject *parent)
    : QObject(parent)
{
    QList<int> list;
    list.append(1);
    qDebug() << "value before slot: " << list;
    connect(this, SIGNAL(exampleSignal(QList<int>)), this, SLOT(exampleSlot(QList<int>)));
    emit exampleSignal(list);
    qDebug() << "value after slot: " << list;
}
void X::exampleSlot(QList<int> list) {
    list.append(2);
    qDebug() << "value in slot: " << list;
}

////////////////////// Файл main.cpp //////////////////////
#include <QApplication>
#include "x.cpp"

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);
    X x;
    return app.exec();
}

////////////////////// Вывод //////////////////////
Запуск...
value before slot: (1)
value in slot: (1, 2)
value after slot: (1)
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

Как сделать чтоб в выводе я получил "value after slot: (1, 2)" ?
Прикрепленные файлы
Прикрепленный файл  x.zip ( 811 байт ) Кол-во скачиваний: 50
 
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
kwisp
  опции профиля:
сообщение 10.3.2009, 15:36
Сообщение #2


астарожна ынтжинэр
*****

Группа: Участник
Сообщений: 1404
Регистрация: 26.11.2008
Из: ТаганрогРодинаЧехова
Пользователь №: 435

Спасибо сказали: 113 раз(а)




Репутация:   23  


указатель либо ссылка
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Diem
  опции профиля:
сообщение 10.3.2009, 15:40
Сообщение #3


Новичок


Группа: Новичок
Сообщений: 8
Регистрация: 10.3.2009
Пользователь №: 603

Спасибо сказали: 0 раз(а)




Репутация:   0  


Ну как бы это очевидно.
Но я с c++ дело ооочень давно не имел, Все варианты перепробовал. Либо несовместимость типов либо ещё хрень какая.
Пожалуйста если можно на этом примере * и & раставить ? :unsure:
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 10.3.2009, 15:42
Сообщение #4


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9655
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


так и пиши ссылку:
void exampleSlot(QList<int> &list);

Цитата(Diem @ 10.3.2009, 18:32) *
connect(this, SIGNAL(exampleSignal(QList<int> &)), this, SLOT(exampleSlot(QList<int>&)));

и сигнал соответственно тоже с сылкой:
void exampleSignal(QList<int> &list);
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
LE0N
  опции профиля:
сообщение 10.3.2009, 15:46
Сообщение #5


Студент
*

Группа: Участник
Сообщений: 97
Регистрация: 10.3.2009
Из: Беларусь
Пользователь №: 604

Спасибо сказали: 0 раз(а)




Репутация:   0  


А почему не * ?
На сколько я знаю, подход с & плохо пахнет ?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 10.3.2009, 15:47
Сообщение #6


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9655
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Цитата(LE0N @ 10.3.2009, 18:46) *
На сколько я знаю, подход с & плохо пахнет ?
например?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Diem
  опции профиля:
сообщение 10.3.2009, 15:49
Сообщение #7


Новичок


Группа: Новичок
Сообщений: 8
Регистрация: 10.3.2009
Пользователь №: 603

Спасибо сказали: 0 раз(а)




Репутация:   0  


Блин совсем запарился.
Всё верно, перепробывав все варианты забыл что и connect должен быть такого вида:
connect(this, SIGNAL(exampleSignal(QList<int>&)), this, SLOT(exampleSlot(QList<int>&)));

Спасибо.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
kwisp
  опции профиля:
сообщение 10.3.2009, 15:51
Сообщение #8


астарожна ынтжинэр
*****

Группа: Участник
Сообщений: 1404
Регистрация: 26.11.2008
Из: ТаганрогРодинаЧехова
Пользователь №: 435

Спасибо сказали: 113 раз(а)




Репутация:   23  


Цитата(LE0N @ 10.3.2009, 15:46) *
А почему не * ?

ну сделай указатель точно так же.



Цитата(Diem @ 10.3.2009, 15:49) *
Блин совсем запарился.
Всё верно, перепробывав все варианты забыл что и connect должен быть такого вида:

а в консольку не смотрим там небось предупреждение что таких сигналов и слотов нет....

Сообщение отредактировал kwisp - 10.3.2009, 15:51
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
LE0N
  опции профиля:
сообщение 10.3.2009, 15:54
Сообщение #9


Студент
*

Группа: Участник
Сообщений: 97
Регистрация: 10.3.2009
Из: Беларусь
Пользователь №: 604

Спасибо сказали: 0 раз(а)




Репутация:   0  


Да просто перехожу с СИ, на СИ++, читаю попутно Страуструпа, и именно там этот подход называют "гнилым".
Цитата
Лучше, однако, избегать изменяющих
свои параметры функций, чтобы не запутывать программу. В большинстве
случаев предпочтительнее, чтобы функция возвращала результат явным
образом, или чтобы использовался параметр типа указателя
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 10.3.2009, 16:17
Сообщение #10


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9655
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


LE0N, на самом деле замечание было верным, но без понимания причин. предпочтительным является такой подход:
1) Если аргумент изменяется в вызываемой функции, то лучше использовать указатель, т.к. при передачи значения это будет видно:
color.getHsv(&h, &s, &v);
2) если аргумент не изменяется, то лучше использовать ссылки, НО константные:
void exampleSlot(const QList<int> &list);

Цитата(kwisp @ 10.3.2009, 18:51) *
а в консольку не смотрим там небось предупреждение что таких сигналов и слотов нет....
скорее всего он даже незнает о такой возможности Qt (добавить в файл проекта строчку: CONFIG += console, тогда Qt будет о многих неровных местах сама сообщать)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

2 страниц V   1 2 >
Тема закрытаНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 24.4.2019, 23:14