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

Войти
 
  Начало Форум WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  
  Просмотр сообщений
Страниц: 1 2 [3] 4 5 ... 58
31  Qt / Общие вопросы / Re: QMediaPlayer и QVideoWidget : Апрель 29, 2020, 12:00
В деструкторе MainWindow вместо player->deleteLater() нужно написать delete player. А лучше изменить тип player на std::unique_ptr<QMediaPlayer>, тогда и delete делать не придётся.
32  Qt / Qt-инструментарий / Re: Можно ли сделать так, чтобы QtCreator не анализировал часть pro файла? : Апрель 24, 2020, 11:20
Ура! Заработало!
Как хоть удалось найти? Даже по прямому поиску qtc_run поисковик ничего внятного не выдает).
Хотел уже было в исходные коды креатора лезть, но не успел).

Среди других идей (добавить Custom Process Step, чтобы при сборке использовались другие переменные; определять родительский процесс) была изначально самая простая и очевидная, что уже есть какая-то переменная, которая определена при запуске в QtCreator. Только как она может называться и как её искать - х.з. Улыбающийся. Решил ткнуть в самое простое: добавил message($$CONFIG) и посмотрел, что выводится при загрузке проекта в QtCreator и при сборке. Там эта qtc_run и засветилась, долго искать не пришлось Улыбающийся. Хотя добавить её в документацию не помешало бы.
33  Qt / Qt-инструментарий / Re: Можно ли сделать так, чтобы QtCreator не анализировал часть pro файла? : Апрель 23, 2020, 19:32
К тому же не всегда возможно донести этот подход до других пользователей), все хотят, чтобы всё работало "из коробки".

"Другие пользователи" - это святое, нельзя допускать, чтобы они напрягались, особенно по всяким мелочам Улыбающийся. Хотят "из коробки"? А пожалуйста!:
Qmake: Add special CONFIG variable "qtc_run" when parsing project files.
34  Qt / Qt-инструментарий / Re: Можно ли сделать так, чтобы QtCreator не анализировал часть pro файла? : Апрель 20, 2020, 15:53
Тогда можно попробовать сделать так: в зависимости от каких-то внешних условий включать или отключать определённые части в .pro файлах. Внешним условием может быть определение/не определение переменной, которая передаётся параметром командной строки при вызове qmake. В QtCreator в Projects/Build Settings  создать отдельную build configurartion для "лёгкой" версии проекта, в Build Steps/Additional arguments передать определение переменной, например "SKIP_EXTRA_PHASE=TRUE". А в .pro файлах проверять, определена заданная переменная или нет, и, в зависимости от этого, что-то делать или не делать Улыбающийся.

Код:
message("-----------")
message("Base phase.")

!defined(SKIP_EXTRA_PHASE, var) {
    message("Extra phase.")
}
message("-----------")
35  Qt / Qt-инструментарий / Re: Можно ли сделать так, чтобы QtCreator не анализировал часть pro файла? : Апрель 20, 2020, 11:35
Можно ли сделать так, чтобы QtCreator не анализировал часть проектного файла при его загрузке?

Если эти "ненужные" части закомментировать в .pro файле, проект будет нормально загружаться в QtCreator?
36  Qt / Общие вопросы / Re: Qt Company и свободные релизы : Апрель 09, 2020, 12:18
Ну есть еще wxWidgets.

Есть, но особых восторгов о ней не слышал. Чтобы бросить Qt и перейти на wxWidgets. Хотя может с такими телодвижениями The Qt Company часть сообщества перетечёт на wxWidgets, от греха подальше, и она похорошеет Улыбающийся.
37  Qt / Общие вопросы / Re: Qt Company и свободные релизы : Апрель 09, 2020, 11:45
Все хотят денег, сотрудники The Qt Company не исключение, а её акционеры и подавно Улыбающийся. Тем более, что конкурентов с достойным кроссплатформенным GUI фреймворком на C++ не видать. Или есть?
38  Qt / Общие вопросы / Re: Как узнать какие файлы нужны для запуска Qt приложения на голом виндусе? : Март 20, 2020, 17:33
Утилиты типа Process Hacker много интересного о процессах выдают. В том числе список модулей.
39  Qt / Общие вопросы / Re: Qt + вумные указватели : Февраль 29, 2020, 12:23
Значит удалять айтем (имея вумный указатель на него) нечем, стандартные средства этого не обеспечивают, придется великом.

Никто за Вас не напишет дерево с нужными Вам характеристиками. Выше предлагали два варианта, которыми люди пользуются. И Вы ими воспользуйтесь, или опишите, что Вы считаете "стандартным" деревом, которое подойдёт для большинства случаев (как std::vector для contiguous контейнера).

У меня немало случаев когда голые указатели на айтемы хранятся в мапе как key или value. Не вижу как менять их на вумные (какие ?). Ну ясно шаред сразу разрушает весь ф-ционал. К сожалению, не проходит и weak. Даже если перетерпеть занудный лок - сравнение мапы перестанет работать.

How can I use a std::map with std::weak_ptr as key?
40  Qt / Общие вопросы / Re: Qt + вумные указватели : Февраль 27, 2020, 13:15
И, как ни странно, мне кажется это куда менее "безопасным". Застрянет где-то item_data - и я могу долго парить айтемы что уже обречены.

А с item.Lock()/Unlock() меньше возни и никогда ничего не застрянет Улыбающийся. И item.data() в Release сборке никогда не вылетит. Ну дело хозяйское.
41  Qt / Общие вопросы / Re: Qt + вумные указватели : Февраль 27, 2020, 11:37
Ну ладно, а что все-таки "отдавать наружу" чтобы удобно было там его юзать? Может так
Код
C++ (Qt)
TreeItemRef item = treeView->Root().childAt(0);
 
item.SetName("test");
if (CheckSomething(item))
DeleteItem(item);
 
if (!item.IsNull())
item.SetName("done");
 
if (item.Lock()) {
...
}

Но weak_ptr тоже будет неудобен и громоздок. Нужен "сахар", обертки, и все такое

То Вы чай без сахара пьёте, то Вам weak_ptr громоздкий Улыбающийся.

Код
C++ (Qt)
if (auto item_data = item.lock())
{
   item_data->doSomething();
   ...
}
Что тут громоздкого?
42  Qt / Общие вопросы / Re: Qt + вумные указватели : Февраль 24, 2020, 12:00
Почему-то напомнило когда старый дед за столом начинает по пьяни травить байки.
Ну да, gsl::owner (ака T*) отличная замена observer_ptr =)
Страуструп верно говорит что "неовнящий" указатель - это самый частый кейз, вот только "овнящего" указателя в программе на современном с++ быть не должно, а gsl::owner это костыль придуманный мелкософтом и прочими монстрами у которых нет возможности и желания переписать всё на "вумники" а развивать и поддерживать это говно надо.
Кстати хочу заметить что обсервер (был?) бесконечно ближе к стандартизации чем gsl::owner=) (в отличие от gsl::span)

Да, с таким gsl::owner (ака T*)... как говорится: "Кому и кобыла невеста." )). Скопируется такой owner несколько раз, столько же раз память кто-то освободит. Веселье обеспечено.

Впрочем, не понимаю, чего к нему так прицепились, наружу вполне может торчать обычный T* в данной задаче о чем я уже писал - обсервер вообще ничем не отличается от Т*.
Вся "вумность" тут вокруг юников, а чем мы наружу смотрим вообще не важно - ровно один и тот же код был бы без "вумников" на голых указателях.

observer_ptr хоть и очень похож на голый указатель, но может уберечь от подобной чуши:
Код
C++ (Qt)
#include <experimental/memory>
 
int main()
{
   using namespace std;
   using namespace std::experimental;
 
   auto u = make_unique<int>(42);
 
   int* p = u.get();
   unique_ptr<int> a{p}; // Compiled.
   delete p;             // Compiled.
 
   observer_ptr<int> o{u.get()};
   unique_ptr<int>   b{o}; // Not compiled.
   delete o;               // Not compiled.
}
Вероятность, что в коде где-то проскочит unique_ptr<int> a{p} хоть и маленькая, но не нулевая.

Вот обсервер ровно для этого и нужен - давать "вью" на указатель (а ВСЕ view не безопасны и никакое удаление не отслеживают, они НЕ ЗА ЭТИМ нужны).

Хоть умные указатели не обязаны отслеживать удаление, такая функциональность может быть полезна. Созданные связи между объектами нужно разрывать, когда один из них удаляется. Взять тот же QLabel::buddy. Когда дружбан удаляется, buddy в QLabel должен занулиться. Теоретически правильный путь - это рассылка сообщений (дружбан погиб) и реакция на них (занулить, возложить цветочки). Но не всегда есть возможность делать коннекты, рассылать сообщения и т.п. И даже когда такая возможность есть, то, если надо только занулить обозревателя и больше ничего делать не нужно, использование QPointer или другого самозануляющегося weak может быть эффективнее, чем создавать коннекты и рассылать сообщения. Так что я не стал бы так просто отмахиваться от возможности самозанулиться для weak. Особенно в многопоточности.

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

Не все weak должны быть trackable (самозануляться, иметь проверку на валидность). Когда есть гарантии, что владелец живёт дольше обозревателя, такая функциональность может быть избыточной, и тогда достаточно голого указателя (обёртки на ним). Потому что за функциональность "проверка на валидность" нужно платить дополнительными операциями в runtime, что не всегда оправдано.

Так что weak/observer всякие нужны, и умные и простые, чтобы можно было выбрать оптимальный вариант исходя из конкретной ситуации.

Кстати тут упоминалось что weak принципиально не имеет get(), а только lock(). Это выглядит очень "идейным", мол, написать неправильно просто не получится! Но по жизни есть масса ситуаций когда multi-threading просто не интересует, и навязанный lock() очень утомителен. Заметим что в (якобы отсталой) Qt реализации это учитывается.

То, что реализация Qt позволяет отстрелить себе ноги - так себе аргумент. А чтобы lock() не утомлял, нужны унифицированные алгоритмы доступа. И вот такая штука была бы полезна: Initial Idea of Indirect If Statement.
43  Qt / Общие вопросы / Re: Qt + вумные указватели : Февраль 22, 2020, 13:51
А вот кстати на самом деле где not_null может пригодиться - хранить не вектор юников, а вектор нот_нулл юников, ...

Правильно. Осталось только выяснить, как будет себя чувствовать вектор с неперемещаемыми not_null<unique> Улыбающийся.

Лично я думаю что указатель никак не может считаться "вумным" если у него нет проверки валидности. И, видимо, не я один если обсервер "experimental".

Есть такое мнение: Abandon observer_ptr.
44  Программирование / С/C++ / Re: C++ Object Token Library : Февраль 21, 2020, 11:15
Move и "destructive move" таки разные вещи. Второй в природе не существует и народ обсуждает, а нужна ли она или стремно.

Что "destructive move" ещё в природе не существует, то я в курсе. Правда ещё не изучал внимательно, что там предлагают. Я всё пытаюсь расшифровать это высказывание Саттера:
Цитировать
Yes, an intended effect of this change is that a not_null<unique_ptr<T>> can only sit there, it can't be moved anywhere. But this is already inherently true, moving one of those is impossible today without breaking the not_null invariant. The correct long-term answer for this would be if C++ gets something along the lines of the relocation / destructive move semantics proposals, where roughly "relocation/destructive-move leaves an object that is guaranteed to be no longer used" or similar (in those proposals, including even its dtor won't be called), then that would naturally enable cases like returning a local not_null<unique_ptr<T>> by value.

С одной стороны запрещают перемещение not_null, чтобы он не оказался в невалидном состоянии, с другой он говорит, что "relocation/destructive move" чем-то поможет. Я явно что-то упускаю в логике Саттера Улыбающийся. Возможности только "returning a local not_null<unique_ptr<T>> by value", по-моему, маловато будет для полноценного использования not_null<unique>.
45  Программирование / С/C++ / Re: C++ Object Token Library : Февраль 21, 2020, 10:51
Всё таки есть объекты, которые после перемещения могут переходить в определённое валидное состояние.

Исходя из требования модели или особенности технической реализации?

Одно другому не мешает Улыбающийся. Те же самые умные указатели std при перемещении "зануляются" в реализации, что соответствует переходу в "пустое" состояние для optional-like объекта. И выглядит это вполне логично:

Код
C++ (Qt)
#include <memory>
#include <iostream>
 
class Label
{
public:
   using Caption = std::unique_ptr<std::string>;
 
   Label() = default;
   explicit Label(Caption caption) noexcept
       : m_caption{std::move(caption)}
   {}
 
   Caption releaseCaption() noexcept
   { return std::move(m_caption); }
 
   void print() const
   {
       std::cout << "Caption: " << (m_caption ? *m_caption : "[none]")
                 << std::endl;
   }
 
private:
   Caption m_caption;
};
 
int main()
{
   Label label{std::make_unique<std::string>("Hello!")};
   label.print();
   label.releaseCaption();
   label.print();
}

Как будет выглядеть Label::releaseCaption(), если придётся вручную переинициализировать m_caption?
Страниц: 1 2 [3] 4 5 ... 58

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