Russian Qt Forum

Qt => Общие вопросы => Тема начата: Alexu007 от Декабрь 27, 2014, 22:03



Название: Qt 4.7 или 5.
Отправлено: Alexu007 от Декабрь 27, 2014, 22:03
Щас чего-то многие на пятый Qt перешли - нужно оно или нет? Какие преимущества, недостатки?


Название: Re: Qt 4.7 или 5.
Отправлено: Bepec от Декабрь 27, 2014, 22:59
Преимущества - хз, больше dll.
С одной стороны там вроде opengl, qml и прочая. С другой стороны я ими не пользуюсь, просто последние проекты которые я делал были уже сделаны на пятерке.

PS а так то новое в массы :D


Название: Re: Qt 4.7 или 5.
Отправлено: Susenin от Декабрь 28, 2014, 04:59
Баги правятся, фичи реализуются  :) Чтобы не натыкаться на новые баги ждите версий 5.x.2.
Новый синтаксис signal/slot, с проверкой на стадии компиляции.
Если у вас приложение на виджетах, они мало развиваются, но немного есть развитие.

Мне наоборот интересно, почему люди держаться за Qt4? Понятно, что часто это требование начальства, но интересны аргументы? Слишком большое и сложное приложение, что уже нет смысла портировать на Qt5?


Название: Re: Qt 4.7 или 5.
Отправлено: xokc от Декабрь 28, 2014, 13:03
Много мелких бонусов, связанных с поддержкой C++ 0x. Довольно часто встречаю в help на используемые методы: "This function was introduced in Qt 5.x".


Название: Re: Qt 4.7 или 5.
Отправлено: Bepec от Декабрь 28, 2014, 13:06
Я б сравнивал как
Qt 4.* - Крестьянская лошадка, неприхотливая, маленькая, тягает плуг и ничего особо не требует.
Qt 5.* - Ухоженный конь на выгул, умеет ходить боком, задом, галопом, рысью, перепрыгивать через барьеры, умеет пользоваться смартфонами, тягает плуг :)


Название: Re: Qt 4.7 или 5.
Отправлено: Igors от Декабрь 28, 2014, 13:54
Мне наоборот интересно, почему люди держаться за Qt4? Понятно, что часто это требование начальства, но интересны аргументы? Слишком большое и сложное приложение, что уже нет смысла портировать на Qt5?
Мой случай: 4.7 еще поддерживает Carbon, а 5 уже нет. А избавиться от Carbon - не один месяц работы (этим сейчас и занимаюсь). Ну конечно если таких завязок нет - то просто "чем новее - тем лучше".

Щас чего-то многие на пятый Qt перешли - нужно оно или нет? Какие преимущества, недостатки?
Так вопрос вообще не стоит. Если есть возможность переходить - надо переходить. Иначе почувствуете себя отстающим, и чем дальше - тем больше.

Напр возникла проблема, наверное баг в Qt. Но на старой версии трудно найти решение, мало шансов на форуме и писать репорт бесполезно - старье уже никого не интересует. Решать самому, варианты

- как-то залатать/обойти, возможно потратив неск дней
- перейти на новую версию где это уже пофиксили

Последний выглядит как-то поприятнее  :)


Название: Re: Qt 4.7 или 5.
Отправлено: kambala от Декабрь 28, 2014, 14:12
почему, кстати, 4.7, а не 4.8? ;)


Название: Re: Qt 4.7 или 5.
Отправлено: Bepec от Декабрь 28, 2014, 14:33
Тут, Igors, ситуация наоборот. На Qt 4.7 проще найти решение, чем на Qt 5 :D Инфы гораздо больше в интернете :)

4.7 потому, что в 4.8 первых версиях летало всё. Ну лично когда я пробовал 4.8 у меня были и вылеты в рабочих проектах и сбросы стилей и прочая. Потом конечно это всё доработали, но впечатление осталось :D


Название: Re: Qt 4.7 или 5.
Отправлено: kuzulis от Декабрь 28, 2014, 14:41
Код:
Новый синтаксис signal/slot, с проверкой на стадии компиляции.

Сомнительная вещь, да и область применения очень узкая - когда сигнатуры сигналов/слотов совпадают 1:1 и нет перекрытых сигналов/слотов.


Название: Re: Qt 4.7 или 5.
Отправлено: Bepec от Декабрь 28, 2014, 16:03
Эта вещь скорее для новичков, но и в ней довольно просто ошибиться. Я так привязал сигналы к обычным методам в начале. Потом весь вымучался, выискивая где же вылетает.

А вот более простой проект, без потоков, нормально работал :D


Название: Re: Qt 4.7 или 5.
Отправлено: Igors от Декабрь 28, 2014, 17:40
Тут, Igors, ситуация наоборот. На Qt 4.7 проще найти решение, чем на Qt 5 :D Инфы гораздо больше в интернете :)
Это "было так" - но сейчас это уже не так. И перестроиться, признать это довольно трудно. Но упорствование совершенно бесперспективно  :)


Название: Re: Qt 4.7 или 5.
Отправлено: Bepec от Декабрь 28, 2014, 17:52
Решения проблем для 4.7 описаны. Для пятерки все отписываются в баг трекер :D


Название: Re: Qt 4.7 или 5.
Отправлено: Alexu007 от Декабрь 28, 2014, 20:13
почему, кстати, 4.7, а не 4.8? ;)
У меня вот такое меню выскакивает, из этого я сделал вывод, что 4.7 и 4.8 примерно одно и то же.

Ну вот к примеру недостаток: в пятёрке больше dll тащить с собой надо, чтобы самый простой exe-шник заработал. Ещё недостаток: 4.7 устанавливается простым запуском установочного файла, в пятёрке вроде вручную нада что-то колдовать...


Название: Re: Qt 4.7 или 5.
Отправлено: gil9red от Декабрь 28, 2014, 20:20
Ещё недостаток: 4.7 устанавливается простым запуском установочного файла, в пятёрке вроде вручную нада что-то колдовать...

Впервые слышу :)
С офф. сайта для винды установщик Qt5 и Qt поставит, и Qt Creator вместе с компилятором.


Название: Re: Qt 4.7 или 5.
Отправлено: kambala от Декабрь 28, 2014, 21:26
почему, кстати, 4.7, а не 4.8? ;)
У меня вот такое меню выскакивает, из этого я сделал вывод, что 4.7 и 4.8 примерно одно и то же.

Ну вот к примеру недостаток: в пятёрке больше dll тащить с собой надо, чтобы самый простой exe-шник заработал. Ещё недостаток: 4.7 устанавливается простым запуском установочного файла, в пятёрке вроде вручную нада что-то колдовать...
чушь несешь в обоих пунктах (кроме длл)


Название: Re: Qt 4.7 или 5.
Отправлено: Susenin от Декабрь 29, 2014, 02:22
Код:
Новый синтаксис signal/slot, с проверкой на стадии компиляции.

Сомнительная вещь, да и область применения очень узкая - когда сигнатуры сигналов/слотов совпадают 1:1 и нет перекрытых сигналов/слотов.

Обойти оба случая можно, просто будет не очень красиво.
Перегруженные сигналы.
Код
C++ (Qt)
connect(ui->spinBox, static_cast<void(QDoubleSpinBox::*)(double)>(&QDoubleSpinBox::valueChanged), this, &MySuperClass::setFactor);
 

Несовпадение сигнатур.
Код
C++ (Qt)
connect(ui->comboBox, &QComboBox::currentTextChanged, [this](const QString & text) { updateText(); });
 

Зато преимущества нового подхода очевидны - не нужно проверять на работоспособность каждое соединение сигнал/слот в приложении.


Название: Re: Qt 4.7 или 5.
Отправлено: navrocky от Декабрь 29, 2014, 20:45
В пятерке пофиксили визуальный баг с квадратной дыркой в скролле под Win8, только ради этого уже можно перейти  ;D


Название: Re: Qt 4.7 или 5.
Отправлено: panAlexey от Декабрь 30, 2014, 23:58
Мне наоборот интересно, почему люди держаться за Qt4?

Шустрее работает. Когда скорость важна, а приложению не нужны печеньки, то я и от 4.2.1 не откажусь.
Меньше вес, шустрее ворочается.
Хотя надо смотреть, что там требуется.


Название: Re: Qt 4.7 или 5.
Отправлено: navrocky от Январь 01, 2015, 14:40
Мне наоборот интересно, почему люди держаться за Qt4?

Шустрее работает. Когда скорость важна, а приложению не нужны печеньки, то я и от 4.2.1 не откажусь.
Меньше вес, шустрее ворочается.
Хотя надо смотреть, что там требуется.

Ну вот как раз с разницей в скорости можно поспорить. Если не сравнивать Quick в Qt4 и Qt5, то в остальном там мало что изменилось. Просто была проведена работа по разделению Qt4 на большее количество модулей. Во всяком случае это совсем не такая разница, как между Qt3 и Qt4.

Более того, если нужна консольная утилита, например, для обработки картинок, то теперь можно не тащить за собой весь GUI с виджетами как в четверке.

Я считаю что всё это держание за Qt4 ретроградством если нет реальных проблем с переходом на Qt5.


Название: Re: Qt 4.7 или 5.
Отправлено: Bepec от Январь 01, 2015, 15:24
А зачем для консоли для обработки картинок тянуть с собой всё UI? Отродясь такого в Qt не видывал, тем более в 4 :D


Название: Re: Qt 4.7 или 5.
Отправлено: Akon от Январь 02, 2015, 00:27
Код:
Новый синтаксис signal/slot, с проверкой на стадии компиляции.

Сомнительная вещь, да и область применения очень узкая - когда сигнатуры сигналов/слотов совпадают 1:1 и нет перекрытых сигналов/слотов.
имхо, это одно из основных достоинств пятерки. Из, может быть, неочевидного - повышенная сторогость дизайна: пусть вы имеете указатель на констант. объект: const AnObject* obj, тогда в старой реализации вы все равно можете подписаться на любой сигнал данного объекта, потому что MOC кладет на константность, а в новой реализации - нет, только константные сигналы вам доступны.


Название: Re: Qt 4.7 или 5.
Отправлено: Bepec от Январь 02, 2015, 01:38
Мне кажется или какой то бред написан?
Как сигнал может быть константным? Сигнал уже по определению константен, ибо он не может быть издан извне объекта и не может поменять ничего...

Ну или чего то я в этой жизни не понимаю.


Название: Re: Qt 4.7 или 5.
Отправлено: Авварон от Январь 02, 2015, 21:19
Bepec
Во-первых, сигналы неконcтантны (зачем кидать сигнал из конст метода?)

Akon
Во-вторах, QObject::connect всегда принимает константный указатель на объект (так как сам connect не меняет видимое состояние объекта)


Название: Re: Qt 4.7 или 5.
Отправлено: Bepec от Январь 02, 2015, 21:26
Сигнал же не изменяет состояние своего объекта , следовательно является константным.

Откуда не кинешь сигнал, он не изменит состояния объекта. Следовательно изменить какие либо данные в объекте не может.
"Константный метод гарантирует, что мы не изменим состояние класса в процессе его работы." ©


Название: Re: Qt 4.7 или 5.
Отправлено: Akon от Январь 02, 2015, 21:37
Цитировать
Во-вторах, QObject::connect всегда принимает константный указатель на объект (так как сам connect не меняет видимое состояние объекта)
Это как-то противоречит моей мысли?

Вот пара функций из QVector:
Код:
T &	operator[] ( int i )
const T & operator[] ( int i ) const

Если эту логику экстраполировать на сигналы, то было бы как-то так:
Код:
void itemChanged(T& item);
void itemChanged(const T& item) const;



Название: Re: Qt 4.7 или 5.
Отправлено: m_ax от Январь 02, 2015, 21:49
"Константный метод гарантирует, что мы не изменим состояние класса в процессе его работы." ©
Нет, на самом деле не гарантирует.. (и не класса, а объекта)

Код
C++ (Qt)
struct object
{
   void some_method() const {  ++val; }
   mutable int val;
};
 


Название: Re: Qt 4.7 или 5.
Отправлено: Bepec от Январь 02, 2015, 21:52
Вы сейчас хитросмудрили, а я говорю про общий случай, а не частный.


Название: Re: Qt 4.7 или 5.
Отправлено: Авварон от Январь 02, 2015, 23:40
Сигнал же не изменяет состояние своего объекта , следовательно является константным.

Откуда не кинешь сигнал, он не изменит состояния объекта. Следовательно изменить какие либо данные в объекте не может.
"Константный метод гарантирует, что мы не изменим состояние класса в процессе его работы." ©

Сигнал - это уведомление об ИЗМЕНЕНИИ видимого состояния объекта. Т.е. он ВСЕГДА зовется из не-конст ф-ии. При этом, в слоте, законнекченном на сигнал, мы можем поменять sender()'a. Я уж молчу что сигнал - это вызов QMetaObject::activate(QObject *sender...) к-ый принимает неконстантный this.

Это как-то противоречит моей мысли?

Вот пара функций из QVector:
Код:
T &	operator[] ( int i )
const T & operator[] ( int i ) const

Если эту логику экстраполировать на сигналы, то было бы как-то так:
Код:
void itemChanged(T& item);
void itemChanged(const T& item) const;

Простите, ШТО? const T &   QVector<T>::operator[] ( int i ) const не меняет объект, какой нафиг itemChanged?


Название: Re: Qt 4.7 или 5.
Отправлено: Bepec от Январь 03, 2015, 03:08
Сигнал САМ ПО СЕБЕ  ничего изменить в объекте не может. Вот тупо не может.
Он не может изменить объект класса никак, никоим образом. А откуда его вызывать значения не имеет.

Приведите мне пример изменение объекта класса при помощи сигнала (только сигнала) :)


PS
Сигнал - это уведомление об ИЗМЕНЕНИИ видимого состояния объекта. Т.е. он ВСЕГДА зовется из не-конст ф-ии. При этом, в слоте, законнекченном на сигнал, мы можем поменять sender()'a. Я уж молчу что сигнал - это вызов QMetaObject::activate(QObject *sender...) к-ый принимает неконстантный this.
Сигнал это метод не изменяющий видимого состояния объекта. А кем и когда он зовётся, не имеет значения. Сигнал НЕ МОЖЕТ изменить объект, повторюсь. Он лишь извещает о чем либо с какими либо аргументами. А вот уже в слоте можно и получить объект класса и изменить, но СЛОТ это не СИГНАЛ :)


Название: Re: Qt 4.7 или 5.
Отправлено: Igors от Январь 03, 2015, 09:20
Сигнал САМ ПО СЕБЕ  ничего изменить в объекте не может. Вот тупо не может.
Он не может изменить объект класса никак, никоим образом.
Это касается только тех данных что Вы сами объявили/видите. А внутренняя начинка QObject может меняться. Напр 2 нитки вызвали один слот с DirectConnection - будет выполнен сначала один, потом второй (но не оба вместе). Внутренний мутекс был захвачен/освобожден. 


Название: Re: Qt 4.7 или 5.
Отправлено: Akon от Январь 03, 2015, 09:43
Цитировать
Простите, ШТО? const T &   QVector<T>::operator[] ( int i ) const не меняет объект, какой нафиг itemChanged?
Вы не поняли мою мысль. Пусть в контейнере меняется элемент, контейнер кидает сигнал об изменении (itemChanged). Далее необходимо предоставить доступ к контейнеру и его объектам как полный, так и только на чтение (т.е. использовать const). Как вы будете проектировать сигналы?


Название: Re: Qt 4.7 или 5.
Отправлено: Авварон от Январь 03, 2015, 11:43
Сигнал это метод не изменяющий видимого состояния объекта. А кем и когда он зовётся, не имеет значения. Сигнал НЕ МОЖЕТ изменить объект, повторюсь. Он лишь извещает о чем либо с какими либо аргументами. А вот уже в слоте можно и получить объект класса и изменить, но СЛОТ это не СИГНАЛ :)

Сигнал вызывает (!) слоты, приконченные к нему (при директ коннекшне). Как вы собрались из кост ф-ии вызывать неконст слоты?


Название: Re: Qt 4.7 или 5.
Отправлено: Akon от Январь 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, т.е. константность не теряется: по конст. указателю только конст. сигналы (как и методы).


Название: Re: Qt 4.7 или 5.
Отправлено: Bepec от Январь 03, 2015, 12:40
To Авварон:
Сигнал ничего не делает, он только извещает о своём прибытии. А дальше уже система сигнал слотов на основании характеристик сигнала либо помещает его в очередь, либо вызывает слот.

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


Название: Re: Qt 4.7 или 5.
Отправлено: Igors от Январь 03, 2015, 13:02
Интересны др аспекты пятерки. Вот напр QWindow и связанные с ним классы. Там довольно много нового, и событийный цикл сильно изменен - сначала событие обрабатывается QWindow и только потом QWidget. Зачем так сделано? Зачем много нового кода "за сценой" (т.е. прямых выгод не дает)?


Название: Re: Qt 4.7 или 5.
Отправлено: Авварон от Январь 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);
}


Название: Re: Qt 4.7 или 5.
Отправлено: Bepec от Январь 03, 2015, 18:59
В общем исходя из обсуждаемого вопроса получаем ответ - Да, мок теперь проверяет соответствие написания const сигналов и объектов, но это ничего не значит :D


Название: Re: Qt 4.7 или 5.
Отправлено: Akon от Январь 05, 2015, 05:35
Цитировать
Вообще, передавать указатели через сигналы - фу.
С чего бы? Хорошо, если не хотите, на чем основывается ваш вывод? Или в рамках класса Container предложите вашу реализацию.



Название: Re: Qt 4.7 или 5.
Отправлено: Авварон от Январь 05, 2015, 11:56
В общем исходя из обсуждаемого вопроса получаем ответ - Да, мок теперь проверяет соответствие написания const сигналов и объектов, но это ничего не значит :D

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

Цитировать
Вообще, передавать указатели через сигналы - фу.
С чего бы? Хорошо, если не хотите, на чем основывается ваш вывод? Или в рамках класса 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. Но никто этого до сих пор не сказал.


Название: Re: Qt 4.7 или 5.
Отправлено: Igors от Январь 05, 2015, 12:36
... что лучше передавать по значению. Это разумно, так как,
Передача аргумента по указателю/ссылке ясно показывает что слот может (и вероятно должен) изменить данные, поэтому по значению - не альтернатива.

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


Название: Re: Qt 4.7 или 5.
Отправлено: Авварон от Январь 05, 2015, 16:25
Передача аргумента по указателю/ссылке ясно показывает что слот может (и вероятно должен) изменить данные, поэтому по значению - не альтернатива.


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

Вообще хотя передача классов по значению в Qt обычно безболезненна - это заметно развращает. Единственный способ навести порядок - рассматривать такую передачу как ошибку.
Рассматривать передачу по значению (читай - по const ссылке) как ошибку? Што?


Название: Re: Qt 4.7 или 5.
Отправлено: Bepec от Январь 05, 2015, 16:27
Как обычно Igors выдвигает идеи будущего :D


Название: Re: Qt 4.7 или 5.
Отправлено: Igors от Январь 05, 2015, 16:40
передачу по значению (читай - по const ссылке)
Это сосем не одно и то же, не надо мухлевать  :)


Название: Re: Qt 4.7 или 5.
Отправлено: Авварон от Январь 05, 2015, 23:20
передачу по значению (читай - по const ссылке)
Это сосем не одно и то же, не надо мухлевать  :)

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

Кстати, вот тут (http://m.blog.csdn.net/blog/CPP_CHEN/17528669) всякие адепты с++ говорят, что передавать по конст ссылке - плохо.


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


Название: Re: Qt 4.7 или 5.
Отправлено: Igors от Январь 16, 2015, 17:35
Поскольку она используется в виде динамической библиотеки, её можно было бы оставить.
Т.е. плагины на четверке, ядро на пятерке? Так не выйдет

А потом, если заказчик захочет побольше возможностей, которые потенциально может дать 5.х, я с заказчика возьму деньги за их реализацию, и заложу в них стоимость перевода на новую версию Qt.  ;)
Ах эти мечты, грезы :)

Если рассматривать любое новое Qt с точки зрения "что оно (конкретно) даст моему проекту", то ответ всегда будет один: почти ничего (или совсем ничего). Заказчика интересует предметная часть, новые фичи и.т.п., а не внутренняя модернизация