LINUX.ORG.RU

Не могу понять, что там с deprecated QFlags в Qt 5.15?

 , , ,


0

1

Пытался собрать старенький проект на Qt 5.15.

Он даже собирается и работает. Но при компиляции куча варнингов про всякие deprecated. Один из варнингов следующий.

Сам код:

class RecordInfoFieldsEditor : public QDialog
{
  RecordInfoFieldsEditor( QWidget * parent = nullptr, Qt::WindowFlags f = 0 ); 


Варнинг такой:
In file included from src/views/record/RecordInfoFieldsEditor.cpp:11:
src/views/record/RecordInfoFieldsEditor.h:22:75: warning: ‘constexpr QFlags<T>::QFlags(QFlags<T>::Zero) [with Enum = Qt::WindowType; QFlags<T>::Zero = int QFlags<Qt::WindowType>::Private::*]’ is deprecated: Use default constructor instead [-Wdeprecated-declarations]
   22 |   RecordInfoFieldsEditor( QWidget * parent = nullptr, Qt::WindowFlags f = 0 );
      |                                                                           ^  

В документации на конструктор QDialog ничего внятного про прекращение поддержки флагов не написано:

QDialog::QDialog(QWidget *parent = nullptr, Qt::WindowFlags f = Qt::WindowFlags())

Constructs a dialog with parent parent.

A dialog is always a top-level widget, but if it has a parent, its default location is centered on top of the parent. It will also share the parent's taskbar entry.

The widget flags f are passed on to the QWidget constructor. If, for example, you don't want a What's This button in the title bar of the dialog, pass Qt::WindowTitleHint | Qt::WindowSystemMenuHint in f.

See also QWidget::setWindowFlags().



Да и для QWidget, от которого наследуется QDialog, тоже глухо:

QWidget::QWidget(QWidget *parent = nullptr, Qt::WindowFlags f = Qt::WindowFlags())

Constructs a widget which is a child of parent, with widget flags set to f.

If parent is nullptr, the new widget becomes a window. If parent is another widget, this widget becomes a child window inside parent. The new widget is deleted when its parent is deleted.
The widget flags argument, f, is normally 0, but it can be set to customize the frame of a window (i.e. parent must be nullptr). To customize the frame, use a value composed from the bitwise OR of any of the window flags.

If you add a child widget to an already visible widget you must explicitly show the child to make it visible.

Note that the X11 version of Qt may not be able to deliver all combinations of style flags on all systems. This is because on X11, Qt can only ask the window manager, and the window manager can override the application's settings. On Windows, Qt can set whatever flags you want



Как исправить код, чтобы этого варнинга не было? Чего хочет Qt или компилятор? Что там с QFlags, их дальше в Qt не будет?

Достаточно ли просто убрать из прототипа и реализации параметр Qt::WindowFlags f и его установку по-умолчанию?

★★★★★

Вот читаю я твои топики и не понимаю, то ли это троллинг, то ли ты действительно особенный. У тебя же ответ буквально в тексте топика, подробный и с примером.

anonymous
()
Ответ на: комментарий от anonymous

Я же спрашиваю: «Достаточно ли просто убрать из прототипа и реализации параметр Qt::WindowFlags f и его установку по-умолчанию?»

Мне в ответ:

Qt::WindowFlags f = Qt::WindowFlags()

Но ведь это эквивалентно отсутствию в параметрах значения по-умолчанию. Зачем писать «Qt::WindowFlags f = Qt::WindowFlags()»?

Xintrea ★★★★★
() автор топика
Ответ на: комментарий от Xintrea

А это

Как исправить код, чтобы этого варнинга не было?

не ты спрашивал?

anonymous
()
Ответ на: комментарий от tnodir

Qt::WindowFlags f = {}

Да, с uniform initialization будет правильней.

Xintrea ★★★★★
() автор топика

constexpr QFlags<T>::QFlags(QFlags<T>::Zero) is deprecated

В документации на конструктор QDialog ничего внятного про прекращение поддержки флагов не написано

Кажется, ТС и действительно особенный.

Тебе компилятор говорит про конструктор QFlags, а ты лезешь читать про конструктор QDialog.

intelfx ★★★★★
()
Ответ на: комментарий от intelfx

Может быть в QDialog используется какой-то хитрый тип, который не каждый QFlags может привести и переварить. Мало ли что там понакрутили авторы.

Xintrea ★★★★★
() автор топика
Ответ на: комментарий от Xintrea

Что такое «в QDialog используется какой-то хитрый тип»? Тип чего?

Ты сейчас пытаешься оправдать своё заведомо некорректное понимание. Спорить с фактами, конечно, занятие интересное, но малопродуктивное.

intelfx ★★★★★
()
Ответ на: комментарий от intelfx

Я и не спорю. Я когда вижу такие варнинги, у меня сразу опускаются руки: ну что они там на этот раз понакрутили? В каком очередном слое абстракций у них там очередные изменения? Конечно у меня понимания никакого нет. Я весь C++ и его библиотеки рассматриваю как черный ящик, в котором невозможно понять что происходит. Потому что стиль мышления любителей плюсов мне не ясен.

Xintrea ★★★★★
() автор топика
Ответ на: комментарий от moonmadness

Вот как вы определили, к чему относится предложение «Use default constructor instead»? К прототипу конструктора, на котором произошла ошибка, или к конструктору типа QFlags, который скрывается за Qt::WindowFlags? Для меня это не очевидно.

Xintrea ★★★★★
() автор топика
Ответ на: комментарий от Xintrea

Это должно быть очевидно для любого, кто умеет читать. У тебя сообщение варнинга начинается с имени типа и конкретного конструктора, к которому относится варнинг:

constexpr QFlags<T>::QFlags(QFlags<T>::Zero) [with подробности] is deprecated: Use default constructor instead

intelfx ★★★★★
()
Последнее исправление: intelfx (всего исправлений: 1)
Ответ на: комментарий от intelfx

Сообщение варнинга может быть любым, мало ли кто и как будет формулировать проблему.

Или ты хочешь сказать, что есть какой-то негласный стандарт для всех компиляторов, что они обязательно должны начинать сообщение с проблемного элемента (например, чтобы обеспечить более простой парсинг или подсветку)?

Xintrea ★★★★★
() автор топика
Ответ на: удаленный комментарий

Так я с вами и не спорю. Я просто хочу понять, какими логическими выводами вы руководствуется, когда делаете утверждения типа «Это должно быть очевидно для любого, кто умеет читать». Мне многие вещи, включая топик, не очевидны. А вы, не моргнув глазом, оперирует не логичными вещами (которые можно было бы хоть как-то формализовать), а какими-то догмами. Я пытаюсь рационализировать ваши утверждения, может быть вы не умеете правильно выражать свои мысли, может быть вы что-то забыли дописать, поэтому задаю дополнительные вопросы, например про формат сообщений.

Вы же вместо адекватного ответа расстраивайтесь, что ваши догмы не работают.

И ещё заметьте, я пока на личные оскорбления, в отличие от вас, не перешёл. Хотя имею полное моральное право.

Xintrea ★★★★★
() автор топика

О! Вот и проблемы с Qt поддержкой подъехали. А писал бы на каком-нибудь FLTK, ничего подобного не было бы. Но это не молодежно. Нужно каждые несколько лет править проект, так ведь интересней.

zx_gamer ★★★
()
Ответ на: комментарий от Xintrea

почему сообщение компилятора понятно мне, хотя я начал изучать плюсы только год назад, а тебе непонятно?

может, тебе лучше не мучать себя, а взять какой-нибудь питон?

anonymous
()
Ответ на: комментарий от zx_gamer

А писал бы на каком-нибудь FLTK

И у ТС бы не было поддержки HiDPI дисплеев, Wayland и огромного количества сахарка, экономящего то время, которое бы тратилось на написание FLTK-обвязок для всяких таблиц и прочего.

То что ТС сделал выбор в пользу современного фреймворка – это жирный плюс. Он разберётся и поправит Warning и его программой и дальше люди будут пользоваться в современных окружениях.

А софт на FLTK просто помрёт вместе с этим тулкитом. Как много сегодня софта на FLTK в этом мире? Вот то-то и оно.

EXL ★★★★★
()
Ответ на: комментарий от Xintrea

Я просто хочу понять, какими логическими выводами вы руководствуется, когда делаете утверждения типа «Это должно быть очевидно для любого, кто умеет читать».

Я оперирую правилами английского. Подлежащее, сказуемое. «X is deprecated» значит только то, что X — deprecated. А ты на это начинаешь возражать «кто сказал, что X? откуда я знаю, что там X? а вдруг X — это не X, а Y?»

Если это «догмы», то нам действительно разговаривать не о чем.

intelfx ★★★★★
()
Последнее исправление: intelfx (всего исправлений: 2)

ТС, знаком ли ты с понятием «макрос» в контексте Си++?

ТС, знаком ли ты с понятием «шаблоны» в контексте Си++?

i-rinat ★★★★★
()
Ответ на: комментарий от zx_gamer

Да уж лучше каждый день править проект чем использовать вместо тулкита полумёртвую васянскую поделку без сообщества не умеющую вообще ничего что должен уметь современный тулкит (про то что Qt не только widget toolkit вообще молчу).

Но на самом деле:

  • В Qt нет проблем с поддержкой. Это deprecation варнинг - лучшее что может с случиться с пользователем библиотеки и признак того как её авторы заботятся о совместимости. Тебе указали что конкретно нужно поправить и дали на это кучу времени. Альтернативы всего две - либо в библиотеке ничего не меняется, что значит что она заброшена, либо в библиотеке ломают совместимость безо всяких предупреждений.
  • В FLTK ухитрились совместить и то и то - несмотря на дохлость сломали совместимость, причём в минорной версии (!). Поэтому в Debian вплоть до 12 версии было два пакета - fltk1.1 и fltk1.3. Но конечно же и deprecations в fltk есть.
anonymous
()
Ответ на: комментарий от zx_gamer

Сам факт такого категоричного заявления говорит о тебе, что ты дальше хеллоуворда не продвигался. Очередное подтверждение звания иксперда-теоретика.

anonymous
()
Ответ на: комментарий от zx_gamer

Я слежу за Вами, Майк Вазовский, и очень внимательно!

anonymous
()
Ответ на: комментарий от zx_gamer

факт, что что-то нужно править в уже готовой программе

Только при обновлении версии Qt же.

Qt 5.15 это подготовительная версия последняя в ветке Qt 5, следующей за которой стала мажорная Qt 6.

Именно для облегчения последующей миграции на Qt 6 были приготовлены специальные deprecated-warning’и.

EXL ★★★★★
()
Последнее исправление: EXL (всего исправлений: 1)
Ответ на: комментарий от Xintrea

Я весь C++ и его библиотеки рассматриваю как черный ящик, в котором невозможно понять что происходит.

В этом основная проблема состоит. Используемый инструмент стоит всё-таки изучить и понять. Если он вызывает такое отторжение, что изучать просто невозможно, то может стоит его сменить?

Плохие новости в том, что какой-то инструмент всё-таки придётся изучить.

Begemoth ★★★★★
()
Ответ на: комментарий от zx_gamer

Не бывает библиотек в которых никогда не меняется API и под них не нужно что-то править в готовых программах. Это просто физически невозможно, даже грамотно сдизайнив API учесть все будущие требования и юзкейсы. Ты бы знал это, если бы хоть строчку собственного кода написал. И знал бы что fltk куда более неудачная по этим критериям.

anonymous
()
Ответ на: комментарий от Begemoth

Если он вызывает такое отторжение, что изучать просто невозможно, то может стоит его сменить?

Да я бы с радостью, но человечество до сих пор ничего лучшего (с такой же совокупностью положительных характеристик) не придумало. Вот и приходится жевать вот это недоразумение.

Xintrea ★★★★★
() автор топика
Ответ на: комментарий от Xintrea

Я весь C++ и его библиотеки рассматриваю как черный ящик, в котором невозможно понять что происходит. Потому что стиль мышления любителей плюсов мне не ясен.

А, теперь понятно. Короче для правильного создания объекта надо использовать конструктор. 0 неправильный конструктор.

И почитай что-нибудь хотя=бы простое про кресты, раз иногда сталкиваешься с ними.

aiqu6Ait ★★★★
()
Ответ на: комментарий от intelfx

Подлежащее, сказуемое. «X is deprecated» значит только то, что X — deprecated. А ты на это начинаешь возражать «кто сказал, что X? откуда я знаю, что там X? а вдруг X — это не X, а Y?»

Ещё раз тебе говорю. Ты не знаешь где он депрекатед. Может быть он депрекатед сам по себе (я это рассматриваю как менее вероятное, потому что такой депрекатед ломает слишком многое). Может быть он депрекатед в том месте, где используется, а именно в прототипе QDialog. Такой депрекатед был бы более локальным. В любом случае, этой информации в тексте нет.

По факту оказывается, что авторы - смелые ребята, и ломают глобально.

Каша из constexpr и всего что после мне ни о чем не говорит. Я эти ваши плюсы расчехляю один раз в пару лет. Они мне неинтересны и порогаю на них только из-за необходимости.

Тебе придется это принять как данность и впредь не удивляться.

Xintrea ★★★★★
() автор топика
Последнее исправление: Xintrea (всего исправлений: 1)
Ответ на: комментарий от aiqu6Ait

И почитай что-нибудь хотя=бы простое про кресты, раз иногда сталкиваешься с ними.

Рас:
https://webhamster.ru/mytetrashare/index/mtb0/1567841136ozv42j753e

Два:
https://webhamster.ru/site/page/index/main/news/739

Это мои книги, правда перечислены не все.

А какая библиотека у тебя?

Xintrea ★★★★★
() автор топика
Ответ на: комментарий от Xintrea

В сообщении английским по белому написано

constexpr QFlags::QFlags(QFlags::Zero) is deprecated

Т.е. устарел конкретный конструктор QFlags

Begemoth ★★★★★
()
Ответ на: комментарий от Xintrea

с такой же совокупностью положительных характеристик

Что же это за характеристики?

Begemoth ★★★★★
()
Ответ на: комментарий от Begemoth

Если бы ты читал, что написано по ссылкам, то обнаружил следующее:

Дело в том, что я считаю, что сложные вещи надо понимать и осознавать на том языке, на котором думаешь. Да, здесь есть проблема в том, что материалы на русском появляются с запозданием: появление русскоязычных материалов запаздывает на несколько лет относительно англоязычного оригинала. Еще существует проблема точности и правильности перевода, но она справедлива для «проходных» изданий и мало касается книг фундаментальной направленности. В конце концов, в русскоязычной литературе, благодаря стараниям многих людей (и переводчиков в частности), сформировалась устойчивая терминология, которая неплохо отображает именование предметной области C++ на русском языке, не скатываясь в тотальное использование англицизмов. Кстати, я пишу именно про бумажные книги. И делаю это потому, что в электронном виде сложный текст я воспринимаю с трудом.


Так что тут мимо - английский не для меня. Из-за дополнительного уровня когнитивной нагрузки понимание полностью обнуляется.

Xintrea ★★★★★
() автор топика
Ответ на: комментарий от Xintrea

Страусс Трупп, стандарт 11 и 17 года, документация на Qt5 и старый справочник Рея Лишнера по stl. по-моему, твоя библиотека очень обширна и достаточна для написания грамотного кода, с поправкой на то что я с плюсами редко сталкиваюсь, последние 3 года вообще на С пишу.

Другой вопрос - как ты имея Страусс Труппа догадался вместо конструктора использовать 0? Это ж нелогично.

aiqu6Ait ★★★★
()
Ответ на: комментарий от Xintrea

Так что тут мимо - английский не для меня. Из-за дополнительного уровня когнитивной нагрузки понимание полностью обнуляется.

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

aiqu6Ait ★★★★
()
Ответ на: комментарий от Xintrea

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

Ты вот не можешь понять сообщение об ошибке, это тоже сложный текст, который ты хочешь видеть на одном языке?

Если да, то современный IT не для тебя. Увы и ах.

Begemoth ★★★★★
()
Ответ на: комментарий от Xintrea

Кстати, Кнут в TAOCP писал, что учил русский специально, чтобы читать труды Ершова в оригинале.

Begemoth ★★★★★
()
Последнее исправление: Begemoth (всего исправлений: 1)
Ответ на: комментарий от aiqu6Ait

Другой вопрос - как ты имея Страусс Труппа догадался вместо конструктора использовать 0? Это ж нелогично.

А плюсы как язык прям эталон логичности :) Так можно было делать ещё в 4-м Qt. Проект старенький, я же об этом написал.

Xintrea ★★★★★
() автор топика
Ответ на: комментарий от aiqu6Ait

Другой вопрос - как ты имея Страусс Труппа догадался вместо конструктора использовать 0? Это ж нелогично.

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

i-rinat ★★★★★
()
Ответ на: комментарий от Xintrea

Из-за дополнительного уровня когнитивной нагрузки понимание полностью обнуляется.

Даже интересно, на каком из слов «constructor», «default», «deprecated», «instead», «is», «use», «warning» возникает когнитивная перегрузка?

i-rinat ★★★★★
()

Когда уже подвезут в стандард C++ формочки, чтоб не пользоваться вендор-локами от сомнительных варяжских фирмочек?

anonymous
()
Ответ на: комментарий от zx_gamer

А вот и любители сравнивать пежо в сборе с кузовом от ситроена подъехали, привет-привет.

Нужно каждые несколько лет править проект

В моём пет-проекте поддерживаются версии Qt от 4.4 до 5.15, это версии, выпущенные троллями с 2008 по 2024, цена поддержки – несколько условных компиляций. Добавлять поддержку Qt 6.4+ планирую, но пока не добрался. Есть аналогичные истории успеха с каким-нибудь прикладным проектом на основе FLTK?

За это время сами плюсы чуть ли не больше поменялись, чем Qt.

hobbit ★★★★★
()
Последнее исправление: hobbit (всего исправлений: 3)
Ответ на: комментарий от anonymous

ТС в первую очередь – автор весьма толкового опенсорсного проекта по хранению структурированной текстовой информации. За это, я считаю, несколько бестолковые вопросы ему можно простить.

А вот что написал безграмотный анонимный любитель наклейки ярлыков, мы доподлинно не знаем…

hobbit ★★★★★
()
Последнее исправление: hobbit (всего исправлений: 1)
Ответ на: комментарий от hobbit

Бестолковые вопросы прощаются кому угодно, а упорное, практически злонамеренное [malicious — прим. внутр. перев.] нежелание смотреть в книгу и видеть там что-либо, кроме фиги, — уже не очень.

intelfx ★★★★★
()
Последнее исправление: intelfx (всего исправлений: 2)
Ответ на: комментарий от hobbit

ТС в первую очередь бравирует своим нежеланием обучаться, дескать нужны ему C++ и Qt раз в пятилетку и ради этого он напрягаться не будет. Что же до его проекта, так он скорее мертв чем жив.

anonymous
()
Ответ на: комментарий от intelfx

Бестолковые вопросы прощаются кому угодно, а упорное, практически злонамеренное

Ты даже не представляешь, как я берегу твою психику хотя бы тем, что пишу на ЛОР не все свои вопросы. Но у тебя есть хорошее решение - просто забань меня и не будешь видеть что я пишу. Незачем себя так мучить.

Xintrea ★★★★★
() автор топика
Ответ на: комментарий от anonymous

ТС в первую очередь бравирует своим нежеланием обучаться, дескать нужны ему C++ и Qt раз в пятилетку и ради этого он напрягаться не будет.

Я не бравирую, я наоборот напрягаюсь. Но при этом понимаю, что в том же JS, PHP и Python мне напрягаться приходится гораздо меньше чем в плюсах и сишечке. И самое интересное - напряг то не происходит не из-за пресловутого «управления памятью» (хотя любой вопрос можно свести к нему), а тупо из-за ублюдского синтаксиса и «сырого» контроля типов. Этот сырой контроль типов вообще не учитывает восприятие человеком сложных конструкций, и фигачит все как есть, ибо от него другого и не требуется. Поэтому когда появляются развесистые структуры, понять по типу кто на ком стоял - весьма нетривиальная задача. Она еще хуже, чем понимать юридический канцелярит на чужом языке.

Что же до его проекта, так он скорее мертв чем жив.

Сколько мне про это говорили, особенно в начале открытой разработки, анонимус даже представить себе не может. Но прошло ~15 лет с момента открытия кода (самому проекту уже больше 20 лет), и некоторые анонимусы уже сами ушли в мир иной, а проект живет и используется.

Xintrea ★★★★★
() автор топика
Для того чтобы оставить комментарий войдите или зарегистрируйтесь.