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

Войти
 
  Начало Форум WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  
  Просмотр сообщений
Страниц: 1 [2] 3
16  Qt / Вопросы новичков / Re: переменные-тёски в разных классах : Май 22, 2020, 05:16
у меня много разных классов, в них похожие переменные. чтобы не путаться, я даю им одинаковые имена, но qt ругается. тогда я просто пишу static перед всеми объявлениями, и всё работает. правильно ли я делаю? если нет, то как правильно? (классы похожие, давать разные имена переменным не вариант)

Static переменные будут общими для всех объектов класса и не только. Это может привести к неожиданным результатам (если не знать об этом). Если создавать обычные переменные с одинаковыми именами в разных классах и обращаться к ним используя оператор расширения области видимости ("::"), то никаких ошибок быть не должно.
А, вообще, советую прислушаться к совету Пантера.
17  Qt / Вопросы новичков / Q : Май 22, 2020, 04:44
всегда думал, что объявление в private .h файла то же самое, что глобальное объявление в начале .cpp файла, оказывается, нет. спасибо за прозрение

Хорошо бы сначала изучить основы ООП C++, а потом начинать программировать в Qt, т.к. там все завязано на классах и объектах. Искренний совет...
18  Qt / Вопросы новичков / Re: html-форматирование в QTableView : Май 21, 2020, 18:38
Честно говоря столько времени "убил" на эту тему... А еще нужно сделать сохранение в разных форматах и справку... Может когда-нибудь я к этому вернусь.

Там может делов на:
Код
C++ (Qt)
style->drawItemText(&painter, lr.toRect(), flags, opt.palette, isEnabled(), d->text, foregroundRole());

Если не смущает, что в paint() каждый раз создаётся и уничтожается QLabel, то можно не заморачиваться. Но меня бы это, как минимум, насторожило.

Ну, быстродействие не "упало", и т.к. QLabel и создается, и уничтожается, то меня это не смущает.

Если приведете здесь реальный рабочий пример с методом drawItemText, то, полагаю, многие люди ищущие в сети ответ на вопрос "как форматировать текст" или "как отображать HTML-форматирование" в представлении (например в QTableView) будут Вам весьма благодарны.
19  Qt / Вопросы новичков / Re: html-форматирование в QTableView : Май 21, 2020, 14:36
У тебя делегаты создаются только для видимых строк, так что пофиг 2 млн их или 20 штук.

Ну, я новичок, не знал об этом. Делегаты для меня непростая тема...
20  Qt / Вопросы новичков / Re: html-форматирование в QTableView : Май 21, 2020, 14:34
2 MB разницы? Ты уверен, что стоит на это обращать внимание?

Поправил, мегабайты неправильно написал...
21  Qt / Вопросы новичков / Re: html-форматирование в QTableView : Май 21, 2020, 14:24
2 MB разницы? Ты уверен, что стоит на это обращать внимание?

Пантер, ты видимо не понял, я думал, что при использовании в представлении QLabel-ов будет сильно "кушаться" оперативка. И просто решил проверить на ИСХОДНЫХ списках насколько больше. Подгрузил не самые большие (всего два списка по 1 млн. строк, у меня используются де модели и два представления). А оказалось, что она, оперативка, "кушается" не больше, а МЕНЬШЕ(!!!), чем раньше, когда я использовал стандартный делегат (по умолчанию). Вообще, форматирование строк мне нужно тогда, когда их (строк) станет много меньше, как правило пару десятков, а тут выходит, что и при исходном большом их количестве памаять расходуется так же, даже меньше...

Видимо это особенности реализации представлений в Qt...
22  Qt / Вопросы новичков / Re: html-форматирование в QTableView : Май 21, 2020, 14:13
Товарищи программисты  Смеющийся
Кое-что протестировал сейчас и оказалось...
При использовании стандартного делегата представления QTableView, приложение при загрузке списка (в модель QStringListModel) размером 2 млн. строк (кириллица) использует оперативной памяти БОЛЬШЕ(!!!), чем, когда используется делегат HtmlDelegate (описанного в этой теме)   Шокированный
Проверил несколько раз и вышло, что с форматированием html приложение кушает оперативы МЕНЬШЕ, чем когда подгружаешь те же списки и они отображаются в представлении с неотформатированными тегами (в первом случае заняло ~346 Мб, во втором (без HTML форматирования) - ~348 Мб).
Следовательно возможность HTML-форматирования в представлении без использования QLabel теряет свою актуальность  Улыбающийся

P.S.: тест проводился на Windows XP SP3. Именно под нее и пишется программа.
23  Qt / Вопросы новичков / Re: html-форматирование в QTableView : Май 21, 2020, 13:37
Вообще, хотелось бы решение, которое выделяет буквы в строках представления не используя при этом виджеты...

Можно в исходниках посмотреть, как QLabel текст рисует. Навскидку, QLabel::paintEvent().

Честно говоря столько времени "убил" на эту тему... А еще нужно сделать сохранение в разных форматах и справку... Может когда-нибудь я к этому вернусь.
24  Qt / Вопросы новичков / Re: html-форматирование в QTableView : Май 21, 2020, 13:34
И пока тему не закрыли, расскажу пару моментов. Перенес этот делегат HTML в свой проект и при "внедрении" надо учесть следующие аспекты:
1) Лучше инициализировать делегат в куче (т.е. HtmlDelegate *delegate = new HtmlDelegate;) Чтобы при выходе из модуля, где он был инициализирован и установлен для QTableView он не пропадал (иначе предаставление будет отображать пустые элементы)
2) Чтобы текст не "прилипал" к левому и правому краю ячейки в представлении необходимо в реализацию делегата (файл htmldelegate.cpp метод paint) немного подправить метод render:

Код
C++ (Qt)
//............
painter->translate(opt.rect.left(), opt.rect.top());
QRect clip(0, 0, opt.rect.width(), opt.rect.height());
 
lbl.render(painter, QPoint(5,5), QRegion(QRect(clip)), QWidget::DrawChildren); // QPoint(5,5)
//.........
 

Немного топорно, конечно, прибавлять по 5 пикселей отступ с каждой стороны, но пока ничего лучше не придумал (opt.displayAlignment = Qt::AlignLeft | Qt::AlignVCenter - почему-то не сработало...).


Методом научного тыка пришел к такой формуле (она добавляет небольшой отступ от левого края ячейки, и по вертикали получается динамика, если увеличивать/уменьшать высоту строки, то текст располагается всегда примерно по центру).

Код
C++ (Qt)
lbl.render(painter, QPoint(5,opt.rect.height()/2 - 7), QRegion(QRect(clip)), QWidget::DrawChildren);
 
25  Qt / Вопросы новичков / Re: html-форматирование в QTableView : Май 21, 2020, 13:04
И пока тему не закрыли, расскажу пару моментов. Перенес этот делегат HTML в свой проект и при "внедрении" надо учесть следующие аспекты:
1) Лучше инициализировать делегат в куче (т.е. HtmlDelegate *delegate = new HtmlDelegate;) Чтобы при выходе из модуля, где он был инициализирован и установлен для QTableView он не пропадал (иначе предаставление будет отображать пустые элементы)
2) Чтобы текст не "прилипал" к левому и правому краю ячейки в представлении необходимо в реализацию делегата (файл htmldelegate.cpp метод paint) немного подправить метод render:

Код
C++ (Qt)
//............
painter->translate(opt.rect.left(), opt.rect.top());
QRect clip(0, 0, opt.rect.width(), opt.rect.height());
 
lbl.render(painter, QPoint(5,5), QRegion(QRect(clip)), QWidget::DrawChildren); // QPoint(5,5)
//.........
 

Немного топорно, конечно, прибавлять по 5 пикселей отступ с каждой стороны, но пока ничего лучше не придумал (opt.displayAlignment = Qt::AlignLeft | Qt::AlignVCenter - почему-то не сработало...).
26  Qt / Вопросы новичков / Re: html-форматирование в QTableView : Май 21, 2020, 12:44
QLabel нужен для рендеринга.
А нужен ли? Если просто так дать таблице/ячейке html строку, она что, эту строку не отрендерит ?  Стоит проверить

У меня не рендерила... Это первое, что приходит в голову, стал бы я заморачиваться делегатами... Где-то встречал, по-моему, решение для QTableWidget, там есть вариант без QLabel (могу ошибаться, много тем перелопатил за это время), но для его предка QTableView нет такой возможности...

Вообще, хотелось бы решение, которое выделяет буквы в строках представления не используя при этом виджеты...
27  Qt / Вопросы новичков / Re: html-форматирование в QTableView : Май 21, 2020, 11:48
Наверное это единственный форум, где решена проблема отображения QLabel в QTableView  Улыбающийся. Тему можно закрывать.
28  Qt / Вопросы новичков / Re: html-форматирование в QTableView : Май 21, 2020, 11:46
Благодаря тому, что Пантер дал мне правильную подсказку (указал на нужный метод), получилось следующее:

htmldelegat.h
Код
C++ (Qt)
#ifndef HTMLDELEGATE_H
#define HTMLDELEGATE_H
 
#include <QStyledItemDelegate>
 
class HtmlDelegate : public QStyledItemDelegate
{
   Q_OBJECT
 
public:
   HtmlDelegate(QObject *parent = 0);
 
   void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const;
};
 
#endif
 

htmldelegat.cpp
Код
C++ (Qt)
#include <QtWidgets>
#include "htmldelegate.h"
 
HtmlDelegate::HtmlDelegate(QObject *parent)
   : QStyledItemDelegate(parent)
{
}
 
void HtmlDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const {
   QStyleOptionViewItem opt = option;
   initStyleOption(&opt, index);
 
   painter->save();
 
   QLabel doc(opt.text);
 
   doc.setText(opt.text);
 
   opt.text = "";
   opt.widget->style()->drawControl(QStyle::CE_ItemViewItem, &option, painter);
 
   painter->translate(opt.rect.left(), opt.rect.top());
   QRect clip(0, 0, opt.rect.width(), opt.rect.height());
 
   doc.render(painter, QPoint(0,0), QRegion(QRect(clip)), QWidget::DrawChildren); // !!!!!
 
   painter->restore();
}
 

main.cpp
Код
C++ (Qt)
#include "htmldelegate.h"
#include <QApplication>
#include <QtWidgets>
 
int main(int argc, char *argv[])
{
   QApplication app(argc, argv);
 
   QStringListModel model;
   QTableView tableView;
 
   QStringList lst;
 
   lst << "<b>First</b> html text"
       << "Se<font color=red>con</font>d html <i>text</i>";
 
   model.setStringList(lst);
   tableView.setModel(&model);
 
   HtmlDelegate delegate;
   tableView.setItemDelegate(&delegate);
   tableView.setEditTriggers(QAbstractItemView::NoEditTriggers);
 
   tableView.setWindowTitle("Html delegate");
   tableView.show();
   tableView.resizeColumnsToContents();
 
   return app.exec();
}
 
29  Qt / Вопросы новичков / Re: html-форматирование в QTableView : Май 21, 2020, 11:33

Спасибо ОГРОМНОЕ! Очень помог!
30  Qt / Вопросы новичков / Re: Обработать сигналы с qLineEdit. Автоматизировать обработку полей. : Май 21, 2020, 09:47
по тем кусочкам кода, которые видно, все написано правильно. Выкладывай тогда полный проект, может ошибка в другом месте Грустный
Даааа, там очень много кода. Думаю, в итоге легче разобраться просто создавая кучу однотипных методов под каждое поле.

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

Неправильный connect

[signal] void QLineEdit::textChanged(const QString &text)

Нет сигнала QLineEdit::textChanged() без параметров, поэтому нет входа в слот по connect

Извиняюсь за оффтоп: Это лучший совет! )
Страниц: 1 [2] 3

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