Russian Qt Forum
Июля 04, 2025, 04:44 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало Форум WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  
  Просмотр сообщений
Страниц: 1 [2] 3 4 ... 39
16  Qt / Вопросы новичков / Re: как правильно работать с Qt, чтобы не было утечек памяти? : Декабря 11, 2023, 16:24
Проблема владения не редкий вопрос на форуме), например, Про деревянный айтем )). Паттерн parent-child, как раз про отношение часть-целое, отношение владения.

В архитектуре QObject владение child, вроде как, передается parent, а вроде как и нет. Никто не мешает удалить child напрямую, минуя parent. Такое вот двойное управление ресурсами.

Как следствие вопросы типа должен ли я озаботится о зачистке памяти?, так как интуитивно не понятно, в каком случае Qt почистит ресурсы, а в каком нет. Постоянно нужно в доки глядеть).
Но я уверен, что >90% разработчиков этот вопрос никак не волнует и интерпретируется даже, как удобство).

Цитировать
Слышал как-то это обходится "муванием". И как тогда удалять тот же виджет (чайлд)?

Можно и с move и без него. Удалять виджет следовало бы либо с помощью API владельца (parent), либо сначала извлечь child из parent, а затем удалять.
Здесь расписан пример реализации иерархии tree-example. Отношение parent-child реализована для класса Node.
17  Qt / Вопросы новичков / Re: как правильно работать с Qt, чтобы не было утечек памяти? : Декабря 06, 2023, 10:34
Да уж наворотили в Qt всего Подмигивающий.

Архитектура Qt закладывалась во времена без unique_ptr, shared_ptr и move семантики.
Но вопросы владения ресурсами и механизм RAII никто не отменял.

Как разработчик будет управлять  ресурсами - это его дело.
Можно new/delete использовать и сырые указатели (типа классические), но это трудоемко в плане подчистки ресурсов. Как минимум нужно в деструкторе удалить, а желательно ещё учесть возможность обработки исключений. Умные указатели unique_ptr, shared_ptr и другие решают задачу подчистки ресурсов, с ними проще.

Разработчики Qt в своей архитектуре смешали вопрос иерархии экземпляров объектов и вопрос владения, заложив правило, что верхний в иерархии объект удаляет объекты ниже в иерархии. Это привело к тому, что в Qt традиционно используют сырые указатели. Тем не менее, сами разработчики Qt рекомендуют использовать unique_ptr для управления ресурсами (стандартный почти аналог QScopedPointer).

При использовании сырых указателей классической ошибкой новичков является не указание родителя у экземпляра объекта (чаще всего this)

Код
C++ (Qt)
QObject * obj = new QObject; // должно быть QObject( this )
 

В этом случае никто не владеет объектом, куда указывает obj => потенциальные утечки ресурсов памяти.

В случае с умным указателем

Код
C++ (Qt)
unique_ptr< QObject > obj = make_unique< QObject >();
 

ресурсом владеет умный указатель, который в любом случае удалит объект, на который указывает obj.
18  Qt / Вопросы новичков / Re: Работа с ком-портом в Qt : Ноября 09, 2023, 14:55
Здесь имеется несоответствие входящих параметров метода write, который принимает const char * или QByteArray, и результата метода text, который возвращает QString.

Нужно явное преобразование QString в QByteArray (сериализация), например в байты формата utf8.

Код
C++ (Qt)
serialPort.write(this->ui->txtInput->text().toUtf8() );
 

При приеме байт необходимо делать обратное преобразование из байт в текст (десериализацию) с помощью метода QString::fromUtf8.
19  Компиляторы и платформы / Windows / Re: Где приложению можно хранить свои файлы если запускаем не под администратором? : Ноября 07, 2023, 09:47
QStandardPaths в помощь.
20  Qt / Общие вопросы / Re: помогите пожалуйста разобраться с ошибками(клас наследованый от QPainter) : Августа 22, 2023, 15:47
Если закрыть глаза  Шокированный на попытку смешать теплое и зеленое, то должно быть так

Код
C++ (Qt)
class Square
   : public QObject // всегда первый
   , public QPainter
{
   Q_OBJECT
public:
  Square(QObject* parent = nullptr);
  void drawSquare(QPoint point,QPoint point2,QPoint point3,QPoint point4);
};
 

Но  В замешательстве, не нужно смешивать средство рисования QPainter и объект с поведением.
QPainter всегда можно создать на лету с указанием устройства, на котором требуется рисовать.
21  Qt / Базы данных / Re: База и таблицы сообщений сервера и клиентов : Апреля 26, 2023, 09:06
Цитировать
... Но через клиента может подключится не один юзер а несколько ...

Одновременно или по очереди?

Если по очереди, то при процедуре logout локальная база должна быть почищена.
А при процедуре login локальная база должна быть синхронизирована с сервером и/или другими клиентами и/или бекапом.

Синхронизацию можно делать не полную, а только N последних сообщений, а остальное подгружать по мере необходимости.

Цитировать
... имеется сервер с базой и таблицей сообщений, в одной таблицу сообщения всех пользователей и всех чатов(если считаете что это не правильно то приму совет как лучше).

Если цель реализовать чат, то следует выбрать подходящую схему - централизованную или распределенную. Всё зависит от конечной цели.

В централизованной (когда одна общая таблица) необходимо иметь БД со всеми сообщениями всех пользователей, которая будет со временем только расти. Обслуживание такого сервера - большие затраты ресурсов (вычислительных и материальных). БД - единая точка отказ, слабое звено. Чем больше пользователей и их сообщений, тем медленнее работает централизованная БД. Такая схема годится для небольших чатов и для учебных проектов.

В распределенной схеме серверная БД занимается только регистрацией пользователей и диспетчеризацией их соединений, а все сообщения хранятся на стороне пользователя. Пользователь при желании может настроить их бэкапирование на свой облачный ресурс. Здесь не требуется большой БД для хранения сообщений, нагрузка на сервер минимальна. Количество пользователей может быть очень большим.
22  Qt / Пользовательский интерфейс (GUI) / Re: Как изменить стандартное окно windows& : Марта 01, 2023, 17:00
Можно, с помощью установки соответствующих флагов Qt::WindowFlags{  Qt::CustomizeWindowHint, Qt::FramelessWindowHint } и.т.д.
23  Qt / Вопросы новичков / Re: Ошибка с декларированием собственного класса : Октября 14, 2022, 09:08
Код
C++ (Qt)
namespace MyNamespace {
class MyClass : public AbstractMyClass
{
 
}; //!!!
}
Q_DECLARE_METATYPE(MyNamespace::MyClass)
 

1) Нет точки с запятой
2) Класс похоже абстрактный
Цитировать
This macro makes the type Type known to QMetaType as long as it provides a public default constructor, a public copy constructor and a public destructor.
24  Qt / Вопросы новичков / Re: Connect не работает : Августа 01, 2022, 18:30

Код:
connect(pAction, SIGNAL(triggered(bool)), this, SLOT(openMyWindow()));
25  Qt / Общие вопросы / Re: Отрисовка текста в QGraphicsItem. : Июня 20, 2022, 07:47
Используйте метод drawText с другими параметрами


Код
C++ (Qt)
void QPainter::drawText(const QRectF &rectangle, int flags, const QString &text, QRectF *boundingRect = nullptr)
26  Qt / Установка, сборка, отладка, тестирование / Re: Бинарник и Библиотеки QT в разные папки : Июня 20, 2022, 07:44
Цитировать
Как разделить бинарник и библиотеки QT в разные папки?

Если нет возможности задать всё в системных путях, то лучше скрипт запуска написать, в котором всё определить.

Для Windows что-то типа того

Код:
set MINGW_DIR=%CD%\3rdparty\mingw-7.3.0
set QT_DIR=%CD%\3rdparty\qt-5.12.6
set PATH=%MINGW_DIR%\bin;%QT_DIR%\bin;%QT_DIR%\plugins;%PATH%
cd "рабочая директория"
start "" "запускаемый бинарник" "параметры запуска"
exit 0
27  Разное / Новости Qt сообщества / Re: Доступ к Qt : Марта 09, 2022, 07:26
https://github.com/qt здесь исходники есть со всей историей
28  Программирование / С/C++ / Re: setMask не работает : Февраля 04, 2022, 07:37
Наверное, из-за

Код
C++ (Qt)
p_mask.fillRect(0, 0, w, h, QColor(Qt::color0));
29  Программирование / С/C++ / Re: Слияние диапазонов : Января 28, 2022, 10:55
Поиграйте с таким примером

Код
C++ (Qt)
#include <algorithm>
 
using Interval = ::std::pair< int, int >;
using Intervals = ::std::vector< Interval >;
 
// условие упорядочивания по значению начала диапазона
struct IntLowerCompare { bool operator () ( const Interval & left, const Interval & right )
{
   return left.second + 1 < right.first; }
};
 
// условие упорядочивания по значению конца диапазона
struct IntUpperCompare { bool operator () ( const Interval & left, const Interval & right )
{
   return left.first + 1 < right.second; }
};
 
// условие необходимости слияния
struct IntMergeCondition { bool operator () ( const Interval & left, const Interval & right )
{
   return left.second + 1 >= right.first; }
};
 
template < typename Intervals, typename Interval, typename LowerCompare, typename UpperCompare, typename MergeCondition >
void add ( Intervals & intervals, const Interval & interval, LowerCompare lower_compare, UpperCompare upper_compare, MergeCondition merge_condition )
{
   // итератор для первого значения в коллекции с возможно пересекающимся интервалом
   auto lower_iter = ::std::lower_bound( ::std::begin( intervals ), ::std::end( intervals ), interval, lower_compare );
   if ( lower_iter != ::std::end( intervals ) )
   {
       // если есть пересечение
       if ( merge_condition( interval, *lower_iter ) )
       {
           // итератор для последнего значения в коллекции с возможно пересекающимся интервалом
           auto upper_iter = ::std::upper_bound( ::std::begin( intervals ), ::std::end( intervals ), interval, upper_compare );
 
           auto first_iter = lower_iter;
           auto last_iter = upper_iter == ::std::end( intervals )
               ? lower_iter
               : upper_iter;
 
           // изменение пересекающегося
           lower_iter->first = ::std::min( first_iter->first, interval.first );
           lower_iter->second= ::std::max( last_iter->second, interval.second );
 
           // удаление лишних
           intervals.erase( ++first_iter, ++last_iter );
       }
       else
       {
           // вставка в середину
           intervals.insert( lower_iter, interval );
       }
   }
   else
   {
       // вставка в конец
       intervals.insert( lower_iter, interval );
   }
}
 
int main ( int, char ** )
{
   Intervals intervals = {{1, 2}, {8, 9 }};
   add( intervals, Interval{ -2, -1 }, IntLowerCompare{}, IntUpperCompare{}, IntMergeCondition{} );
   add( intervals, Interval{ 5, 5 },  IntLowerCompare{}, IntUpperCompare{}, IntMergeCondition{} );
   add( intervals, Interval{ 5, 7 }, IntLowerCompare{}, IntUpperCompare{}, IntMergeCondition{} );
   add( intervals, Interval{ 3, 7 }, IntLowerCompare{}, IntUpperCompare{}, IntMergeCondition{} );
   add( intervals, Interval{ 0, 10 }, IntLowerCompare{}, IntUpperCompare{}, IntMergeCondition{} );
   add( intervals, Interval{ 11, 11 }, IntLowerCompare{}, IntUpperCompare{}, IntMergeCondition{} );
}
 
30  Программирование / С/C++ / Re: Слияние диапазонов : Января 25, 2022, 23:31
Используйте для поиска в упорядоченном векторе функции алгоритмов https://en.cppreference.com/w/cpp/algorithm/equal_range, а далее решайте, что следует сделать - изменить значение по одному из итераторов или вставить значение в контейнер.
Страниц: 1 [2] 3 4 ... 39

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