Russian Qt Forum
Ноябрь 22, 2024, 23:17 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: 1 2 [3] 4   Вниз
  Печать  
Автор Тема: Qt 4.7 или 5.  (Прочитано 22568 раз)
Akon
Гость
« Ответ #30 : Январь 03, 2015, 09:43 »

Цитировать
Простите, ШТО? const T &   QVector<T>::operator[] ( int i ) const не меняет объект, какой нафиг itemChanged?
Вы не поняли мою мысль. Пусть в контейнере меняется элемент, контейнер кидает сигнал об изменении (itemChanged). Далее необходимо предоставить доступ к контейнеру и его объектам как полный, так и только на чтение (т.е. использовать const). Как вы будете проектировать сигналы?
Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« Ответ #31 : Январь 03, 2015, 11:43 »

Сигнал это метод не изменяющий видимого состояния объекта. А кем и когда он зовётся, не имеет значения. Сигнал НЕ МОЖЕТ изменить объект, повторюсь. Он лишь извещает о чем либо с какими либо аргументами. А вот уже в слоте можно и получить объект класса и изменить, но СЛОТ это не СИГНАЛ Улыбающийся

Сигнал вызывает (!) слоты, приконченные к нему (при директ коннекшне). Как вы собрались из кост ф-ии вызывать неконст слоты?
Записан
Akon
Гость
« Ответ #32 : Январь 03, 2015, 12:35 »

??
Типичный код приложения. Указатели используются для обобщения на полиморфизм.
Код:
class Container
{
public:
const QList<Item*>& items();
const QList<const Item*>& items() const;

Q_SIGNALS:
void itemChanged(Item* item);
void itemChanged(const Item* item) const;

private:
QList<Item*> items_;
};

Имея const Coontainer* вам доступен только const QList<const Item*>& items() const; Неужели по аналогии вы не хотите доступ только к void itemChanged(const Item* item) const?

C MOCом вы имея const Coontainer* можете подписаться на void itemChanged(Item* item) и изменить объект. С новыми сигналами/слотами (опирающимися на С++11) принципиально возможно такое ограничение, что вам будет доступен только void itemChanged(const Item* item) const, т.е. константность не теряется: по конст. указателю только конст. сигналы (как и методы).
Записан
Bepec
Гость
« Ответ #33 : Январь 03, 2015, 12:40 »

To Авварон:
Сигнал ничего не делает, он только извещает о своём прибытии. А дальше уже система сигнал слотов на основании характеристик сигнала либо помещает его в очередь, либо вызывает слот.

to Akon:
Можно подписаться на константный сигнал и изменить данные, получив указатель на объект. Или неужто даже это проверяется моком? Веселый
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #34 : Январь 03, 2015, 13:02 »

Интересны др аспекты пятерки. Вот напр QWindow и связанные с ним классы. Там довольно много нового, и событийный цикл сильно изменен - сначала событие обрабатывается QWindow и только потом QWidget. Зачем так сделано? Зачем много нового кода "за сценой" (т.е. прямых выгод не дает)?
Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« Ответ #35 : Январь 03, 2015, 15:48 »

??
Типичный код приложения. Указатели используются для обобщения на полиморфизм.
Код:
class Container
{
public:
const QList<Item*>& items();
const QList<const Item*>& items() const;

Q_SIGNALS:
void itemChanged(Item* item);
void itemChanged(const Item* item) const;

private:
QList<Item*> items_;
};

Имея const Coontainer* вам доступен только const QList<const Item*>& items() const; Неужели по аналогии вы не хотите доступ только к void itemChanged(const Item* item) const?

C MOCом вы имея const Coontainer* можете подписаться на void itemChanged(Item* item) и изменить объект. С новыми сигналами/слотами (опирающимися на С++11) принципиально возможно такое ограничение, что вам будет доступен только void itemChanged(const Item* item) const, т.е. константность не теряется: по конст. указателю только конст. сигналы (как и методы).
Не хотим. Вообще, передавать указатели через сигналы - фу.

Кстати вот код константного сигнала. Нафиг такое надо?)
Код:
// SIGNAL 1
void Application::changed() const
{
    QMetaObject::activate(const_cast< Application *>(this), &staticMetaObject, 1, 0);
}
Записан
Bepec
Гость
« Ответ #36 : Январь 03, 2015, 18:59 »

В общем исходя из обсуждаемого вопроса получаем ответ - Да, мок теперь проверяет соответствие написания const сигналов и объектов, но это ничего не значит Веселый
Записан
Akon
Гость
« Ответ #37 : Январь 05, 2015, 05:35 »

Цитировать
Вообще, передавать указатели через сигналы - фу.
С чего бы? Хорошо, если не хотите, на чем основывается ваш вывод? Или в рамках класса Container предложите вашу реализацию.

Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« Ответ #38 : Январь 05, 2015, 11:56 »

В общем исходя из обсуждаемого вопроса получаем ответ - Да, мок теперь проверяет соответствие написания const сигналов и объектов, но это ничего не значит Веселый

Ммм, что он проверяет?

Цитировать
Вообще, передавать указатели через сигналы - фу.
С чего бы? Хорошо, если не хотите, на чем основывается ваш вывод? Или в рамках класса Container предложите вашу реализацию.

Где-то в доке кутешников написано, что лучше передавать по значению. Это разумно, так как, передавая указатель, вы форсите себя использовать Qt::DirectConnection (а вдруг успеет прийти эвент, к-ый удалит ваш айтем?). А в случае direct connection ваш сигнал может поменять состояние объекта (так как вызывает коллбеки) => объявлять его константным  - только путать людей.

Если вам так хочется перегружать сигнал для const Item*, так и перегружайте, зачем вам помечать сигнал как const? Тем более, что connect не проверяет на соответствие константность сигнала и слота (да и зачем?):
Код:
class Application 
{
...
public slots:
    void newWindow();
signals:
    void changed() const;
...
};

    connect(this, &Application::changed, this, &Application::newWindow);
Единственное (!), зачем нужны const сигналы - это вызывать их из const методов (юзкейз редкий, но вдруг надо), дабы не делать самому const_cast. Но никто этого до сих пор не сказал.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #39 : Январь 05, 2015, 12:36 »

... что лучше передавать по значению. Это разумно, так как,
Передача аргумента по указателю/ссылке ясно показывает что слот может (и вероятно должен) изменить данные, поэтому по значению - не альтернатива.

Вообще хотя передача классов по значению в Qt обычно безболезненна - это заметно развращает. Единственный способ навести порядок - рассматривать такую передачу как ошибку. А соглашаясь что "так можно" - концов уже не найти. На худой конец юзать пресловутый шаред пойнтер. 
Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« Ответ #40 : Январь 05, 2015, 16:25 »

Передача аргумента по указателю/ссылке ясно показывает что слот может (и вероятно должен) изменить данные, поэтому по значению - не альтернатива.


Но в исходной задаче изменение айтема не подразумевается, там указатели для полиморфизма.

Вообще хотя передача классов по значению в Qt обычно безболезненна - это заметно развращает. Единственный способ навести порядок - рассматривать такую передачу как ошибку.
Рассматривать передачу по значению (читай - по const ссылке) как ошибку? Што?
Записан
Bepec
Гость
« Ответ #41 : Январь 05, 2015, 16:27 »

Как обычно Igors выдвигает идеи будущего Веселый
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #42 : Январь 05, 2015, 16:40 »

передачу по значению (читай - по const ссылке)
Это сосем не одно и то же, не надо мухлевать  Улыбающийся
Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« Ответ #43 : Январь 05, 2015, 23:20 »

передачу по значению (читай - по const ссылке)
Это сосем не одно и то же, не надо мухлевать  Улыбающийся

Ну понятно же по контексту, что имелась ввиду передача по конст ссылке:)

Кстати, вот тут всякие адепты с++ говорят, что передавать по конст ссылке - плохо.
Записан
Гурман
Гуру общения
******
Offline Offline

Сообщений: 1442

Qt 2.2, 3.3, 4.5, 4,7, 4.8, 5.3, 5.6, 5.9, 5.12


Просмотр профиля
« Ответ #44 : Январь 16, 2015, 15:36 »

В тему - вот у меня проект, часть которого была сделана на 4.7, когда он появился. Сейчас проект существенно развивается, причем старая часть - не так существенно. Поскольку она используется в виде динамической библиотеки, её можно было бы оставить. Но я решил всё продолжать делать на 4.7. Почему? Я лучше сначала сделаю первую версию на 4.7. Это предсказуемо. А потом, если заказчик захочет побольше возможностей, которые потенциально может дать 5.х, я с заказчика возьму деньги за их реализацию, и заложу в них стоимость перевода на новую версию Qt.  Подмигивающий Объем проекта сейчас около 65000 строк, в финале ожидается около 100000.
Записан

2^7-1 == 127, задумайтесь...
Страниц: 1 2 [3] 4   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.261 секунд. Запросов: 22.