четверг, 2 февраля 2023 г.

QSettings: работа с ini файлом, русские символы.

 QSettings работает в т.ч. и с ini файлами. Локальные (русские, например) символы обрабатываются с помощью кодеков. Наверное, ini файл следует сохранять в utf8 кодировке, для совместимостью с Linux и проч.

QSettings qst(ini_fn, QSettings::IniFormat);
qst.setIniCodec("UTF8"); // Кодек UTF8 (Windows-1251 и т.д)
qst.beginGroup("SERVER"); // Работаем с секцией "SERVER"
    auto listen_to = qst.value("firebird_tcp_port", "3050").toString(); // Читаем значение порта FB
    auto wrk_dir = qst.value("wrk_dir", "C:/Строительный эксперт").toString(); // рабочая директория
qst.endGroup();

QTimer::singleShot() как средство асинхронного вызова слота (альтернатива QMetaObject::invokeMethod)

 Предположим, есть класс 

class X: public QObject { public slots: void slotX(int x); };



Чтобы асинхронно вызвать slotX (например, из метода того же класса X), используют QMetaObject::invokeMethod():


QMetaObject::invokeMethod(this, "slotX", Qt::QueuedConnection, Q_ARG(int, 123));

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


QTimer::singleShot(0, [this]() { slotX(123); });



или


QTimer::singleShot(0, this, [this]() { slotX(123); });

Мы тут обошлись вообще без слотов.
Здесь добавленный параметр this - т.н. "контекст", Для контроля существования объекта - получателя (в данном случае объекта this), сие особенно полезно при передаче сигналов между нитями. Если контекст получателя не существует, сообщение даже не будет поставлено в очередь.
Напомню, что если нить объекта контекста не совпадает с нитью эмиттера сигнала, такой сигнал будет поставлен в очередь объекта нити-приемника.










Лямбды в connect() (сигнал/слот).

 Предположим, на форме есть кнопка QPushButton pbRestart, по нажатию которой должен быть исполнен какой-то метод объекта формы. 

Достаточно в качестве слота указать лямбду:

connect(ui->pbRestart, &QPushButton::clicked, this, [this](){ restart(); }); // Крутяк

    Параметры:

  1. ui->pbRestart - ссылка на источник сигнала clicked.
  2. &QPushButton::clicked - ссылка на метод, объявленный в классе источника.
  3. this т.н. "контекст". На самом деле, параметр необязателен. Компилятор выдаст предупреждение, но пропустит. Польза от него в том, что перед передачей сигнала в лямбду, Qt система проверит существование объекта контекста. Если он был удален, то код в лямбде вызван не будет. Если контекст получателя не существует, сообщение даже не будет поставлено в очередь. Напомню, что если нить объекта контекста не совпадает с нитью эмиттера сигнала, такой сигнал будет поставлен в очередь объекта нити-приемника. Безопасность! 
  4. [this](){ restart(); } - само тело лямбды. Здесь в лямбду передается захваченная копия указателя this/


MinGW + CMake: добавление иконки к приложению

 В каталоге проекта создаем подкаталог resources, в подкаталоге - иконка MainIcon.ico и текстовый файл rcmain.rc, содержащий:

IDI_ICON1 ICON DISCARDABLE "MainIcon.ico"

В CMake файл добавляем:

set(RES_FILES "") if(MINGW) set(RES_FILES "resources/rcmain.rc") set(CMAKE_RC_COMPILER_INIT windres) ENABLE_LANGUAGE(RC) SET(CMAKE_RC_COMPILE_OBJECT "<CMAKE_RC_COMPILER> <FLAGS> -O coff <DEFINES> -i <SOURCE> -o <OBJECT>") endif(MINGW)





Затем переменную RES_FILES добавляем в add_executable:

        add_executable(<имя_проекта>
            ${PROJECT_SOURCES}
            ${RES_FILES}
        )


четверг, 14 ноября 2019 г.

среда, 6 ноября 2019 г.

03.04. Model/View в Qt. Готовые классы представлений.

Существующие классы представления элементов

Источник.

Продолжение. Начало - здесь.


Виджеты на основе элементов имеют имена, которые отражают их использование: QListWidget предоставляет список элементов, QTreeWidget отображает многоуровневую древовидную структуру, а QTableWidget представляет таблицу из ячеек-элементов. Каждый класс наследует поведение класса QAbstractItemView, которое реализует общее поведение для выбора элементов и управления заголовками.

03.03 Model/View в Qt. Создание новых моделей.

Создание новых моделей

Разделение функциональности между компонентами model/view позволяет создавать модели, которые могут использовать преимущества существующих представленийЭтот подход позволяет нам представлять данные из различных источников, используя стандартные компоненты графического интерфейса пользователя, такие как QListView , QTableView и QTreeView.
Класс QAbstractItemModel предоставляет достаточно гибкий интерфейс для поддержки источников данных, которые упорядочивают информацию в иерархических структурах, что дает возможность добавления, удаления, изменения данных или их сортировку каким-либо образом. Он также обеспечивает поддержку операций перетаскивания.
Классы QAbstractListModel и QAbstractTableModel классов обеспечивают поддержку интерфейсов для более простых неиерархических структур данных, и проще использовать в качестве отправной точки для простых списков и таблиц моделей.
В этом разделе мы создадим простую read-only модель только для чтения, чтобы изучить основные принципы архитектуры model/view. Далее модель будет изменена так, чтобы данные стало можно редактировать.

QSettings: работа с ini файлом, русские символы.

  QSettings работает в т.ч. и с ini файлами. Локальные (русские, например) символы обрабатываются с помощью кодеков. Наверное, ini файл сле...