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

Войти
 
  Начало Форум WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  
  Просмотр сообщений
Страниц: 1 2 [3]
31  Qt / Вопросы новичков / Re: Обработать сигналы с qLineEdit. Автоматизировать обработку полей. : Май 21, 2020, 09:43
В этом случае придется в дизайнере делать promote widget. И вообще, этот случай не стоит наследования.

Сделал как смог. Сам еще новичок в Qt-программировании. Но, хоть какой-то рабочий пример, который отвечает на вопрос топикстартера. Просто зачастую, советы а-ля: "Ты делаешь совершенно неправильно" и "Гугл в помощь.", совершенно не помогают...
Тот код, который привел топикстартер, вполне рабочий, значит проблема где-то в другом месте. Не думаю, что твой пример ему поможет. Веселый Но я ни в коем случае не говорю, что ты сделал что-то неправильно, иногда переопределение классов виджетов может быть оправдано.

К сожалению код топикстартера не проверял... Но мне показалось не очень корректным, что он создал кучу коннектов, а если "куча полей" пополнится еще парочкой, то придется писать дополнительные коннекты... Вот и привел пример, исключающий эту проблему. На истину в последней инстанции не претендую  Улыбающийся
32  Qt / Вопросы новичков / Re: html-форматирование в QTableView : Май 21, 2020, 09:37
tamplier, у тебя же выше был код HtmlDelegate::paint. Для QLabel тоже нужно реализовать этот метод и правильно разместить виджет.

Да. Я понимаю, что это логично, именно метод paint использовать для отображения QLabel в представлении... Но у меня затык в том, что QLabel не содержит метод drawContents, и аналогичного я не нашел. Не могу понять как отрисовать виджет QLabel в итеме...  Обеспокоенный
33  Qt / Вопросы новичков / Re: Обработать сигналы с qLineEdit. Автоматизировать обработку полей. : Май 21, 2020, 09:28
В этом случае придется в дизайнере делать promote widget. И вообще, этот случай не стоит наследования.

Сделал как смог. Сам еще новичок в Qt-программировании. Но, хоть какой-то рабочий пример, который отвечает на вопрос топикстартера. Просто зачастую, советы а-ля: "Ты делаешь совершенно неправильно" и "Гугл в помощь.", совершенно не помогают...
34  Qt / Вопросы новичков / Re: html-форматирование в QTableView : Май 21, 2020, 09:20
А куда ты дел все, что связано с QStyleOptionViewItem? Ты же должен не только создать виджет, но и корректно его разместить.

Уважаемый Пантер, не очень понимаю, что ты имеешь ввиду... Хотя бы пару строчек кода, или ссылку на пример... Куда и как именно я должен разместить "все, что связано с QStyleOptionViewItem"?
35  Qt / Вопросы новичков / Re: Обработать сигналы с qLineEdit. Автоматизировать обработку полей. : Май 21, 2020, 08:34
Вот что-то вроде этого (небольшой полностью рабочий пример). Только я формы не дизайнером сделал. Надеюсь поможет.

myline.h:
Код
C++ (Qt)
#ifndef MYLINE_H
#define MYLINE_H
 
#include <QLineEdit>
 
class MyLine : public QLineEdit {
 
Q_OBJECT
public:
explicit MyLine(QWidget *parent = 0);
 
signals:
 
public slots:
void MySlot(const QString &strToDouble);
 
};
 
#endif // MYLINE_H
 


myline.cpp:
Код
C++ (Qt)
#include <QDebug>
#include <QRegularExpression>
#include "myline.h"
 
MyLine::MyLine(QWidget *parent) : QLineEdit(parent) {
 
connect(this, SIGNAL(textChanged(const QString &)), SLOT(MySlot(const QString &)));
 
}
 
void MyLine::MySlot(const QString &strToDouble) {
QRegularExpression rxpComplex("^\\d+(\\.\\d+)?$");
 
QString str = strToDouble;
if(!str.contains(rxpComplex)) qDebug() << sender()->objectName()
                                      + " - value " + str + " is not double!";
 
}
 

mywidget.h:
Код
C++ (Qt)
#ifndef MYWIDGET_H
#define MYWIDGET_H
 
#include <QWidget>
 
class MyWidget : public QWidget {
Q_OBJECT
 
public:
MyWidget(QWidget *parent = 0);
 
virtual ~MyWidget();
};
 
#endif // MYWIDGET_H
 

mywidget.cpp:
Код
C++ (Qt)
#include <QtWidgets>
#include "mywidget.h"
#include "myline.h"
 
MyWidget::MyWidget(QWidget *parent) : QWidget(parent) {
MyLine *line1 = new MyLine;
line1->setObjectName("line1");
MyLine *line2 = new MyLine;
line2->setObjectName("line2");
MyLine *line3 = new MyLine;
line3->setObjectName("line3");
 
QVBoxLayout *vbox = new QVBoxLayout;
vbox->addWidget(line1);
vbox->addWidget(line2);
vbox->addWidget(line3);
setLayout(vbox);
}
 

main.cpp:
Код
C++ (Qt)
#include <QApplication>
#include "mywidget.h"
 
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MyWidget w;
w.show();
 
return a.exec();
}
 
36  Qt / Вопросы новичков / Re: Обработать сигналы с qLineEdit. Автоматизировать обработку полей. : Май 21, 2020, 08:11
У меня в программе куча полей qLineEdit.
У каждого поля, мне нужно перейти к слоту от изменения текста в них.
Но так как полей много, очень много, чтобы не писать кучу однотипных методов, я просто создаю один единственный слот для обработки всех полей, которые будут обрабатывать сигналы изменения текста.
Проблема заключается в том, что я не знаю что вставлять в качестве объекта обращения ui(на скриншоте это obj), т. е. мне нужно, чтобы то поле, что посылает сигнал, и обрабатывалось(я же не смогу изменить название поля в программе, когда она запущена).

Вместо obj, должно стоять название поля qLineEdit, от которого идёт сигнал по идеи. Или sender возвращает что то другое(Я думаю, что он возвращает имя того, кто посылает сигнал)?

Создаешь свой класс и наследуешь его от QLineEdit. И в этом классе можно определить слот и "приконнектить" его к нужному сигналу (этого же класса). Я бы так делал.
37  Qt / Вопросы новичков / Re: html-форматирование в QTableView : Май 21, 2020, 06:23
Да, пробовал подобный вариант. Но переопределение методов createEditor и setEditorData предполагает, что будет редактирование модели через представление. В моем случае этого не надо. И если реализовать свой делегат подобным образом, то текст в представлении отображается некорректно, виджет QLabel как-бы накладывается на текст (происходит дублирование).

В моем случае это выглядит так:



Код следующий:

delegate.h:
Код
C++ (Qt)
#ifndef DELEGATE_H
#define DELEGATE_H
 
#include <QStyledItemDelegate>
 
class HtmlDelegate : public QStyledItemDelegate
{
   Q_OBJECT
 
public:
HtmlDelegate(QObject *parent = 0);
 
QWidget* createEditor(QWidget *parent, const QStyleOptionViewItem& option, const QModelIndex& index) const;
 
void setEditorData(QWidget* editor, const QModelIndex& index) const;
};
 
#endif
 

delegate.cpp:
Код
C++ (Qt)
#include "delegate.h"
 
#include <QtWidgets>
 
HtmlDelegate::HtmlDelegate(QObject *parent) : QStyledItemDelegate(parent)
{
}
 
 
QWidget* HtmlDelegate::createEditor(QWidget* parent, const QStyleOptionViewItem&, const QModelIndex&) const
{
QLabel* label = new QLabel(parent);
 
return label;
}
 
void HtmlDelegate::setEditorData(QWidget* editor, const QModelIndex& index) const
{
QString value = index.model()->data(index, Qt::DisplayRole).toString();
 
QLabel* label = static_cast<QLabel*>(editor);
 
label->setText(value);
}
 
 

main.cpp:
Код
C++ (Qt)
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
 
QStringListModel model;
QTableView tableView;
 
QStringList lst;
 
lst << "<b>First</b> html text" << "Second 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();
for(int i=0; i<lst.count(); ++i) {
tableView.openPersistentEditor(model.index(i)); // view delegate all time
}
 
return app.exec();
}
 
38  Qt / Вопросы новичков / Re: html-форматирование в QTableView : Май 20, 2020, 20:56
Спасибо большое за подсказки!
Решил проблему следующим способом (может кому пригодится):

delegate.h:
Код
C++ (Qt)
#ifndef DELEGATE_H
#define DELEGATE_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
 

delegate.cpp:
Код
C++ (Qt)
#include "delegate.h"
 
#include <QtWidgets>
 
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();
 
QTextDocument doc(opt.text);
 
doc.setHtml(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.drawContents(painter, clip);
 
painter->restore();
}
 

main.cpp:
Код
C++ (Qt)
#include "delegate.h"
#include <QApplication>
#include <QtWidgets>
 
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
 
QStringListModel model;
QTableView tableView;
 
QStringList lst;
lst << "<b>Bold text.</b> Custom text." << "It's <font color=red><b>red</b></font> text. <i>Italic</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();
}
 

Честно признаюсь решением не доволен... Хоть и списки для форматированного вывода в итоге должны быть небольшими, всё-равно не хочется элементами представления делать такие "тяжелые" виджеты, как QTextDocument... Но так и не придумал, как "прикрутить" к модели QTableView виджет QLabel. В сети и в справке ничего вразумительного так и не нашел, может плохо искал...
39  Qt / Вопросы новичков / Re: html-форматирование в QTableView : Май 20, 2020, 20:35
Использовать делегаты? Как-то прикрутить список указателей на QLabel-ы?
А если просто в методе модели data (DisplayRole) формировать нужную html строку из исходной?

Было бы замечательно, но метод возвращает тип QVariant и к типу QLabel его не приведешь (чтобы отображать в представлении текст отформатированный в стиле html).
40  Qt / Вопросы новичков / html-форматирование в QTableView : Май 09, 2020, 18:19
Уважаемые форумчане!
Скажите, пожалуйста, каким образом можно "прикрутить" отображение строк с html-форматированием в QTableView?

Если упростить, то ситуация следующая (просто не знаю даже куда копать): есть список строк QStringList. Есть модель QStringListModel, которая является моделью данного списка и есть представление QTableView, которое отображает список строк (модели) с одним столбцом. Необходимо чтобы определенные буквы в представлении (в строках) отображались жирным шрифтом (либо, как-то выделялись)... Понятно, что в контексте QStringList и QStringListModel данную задачу решить не получится.
Были мысли использовать QList<QLabel *> с QAbstractListModel. Но не могу понять как это всё реализовать...
Еще как вариант использовать делегат, но с темой делегатов я на Вы, почитав книги М.Шлее и Ж.Бланшет и М.Саммерфилд, так и не разобрался с данной темой, да и как оказалось, то, что легко понимается в теории, зачастую на практике применить не получается...
Итог: реализовав бОльшую часть приложения запнулся на казалось бы пустяковой задаче.

Буду признателен любым советам по теме. Подскажите хотя бы куда копать. Использовать делегаты? Как-то прикрутить список указателей на QLabel-ы? Может QSyntaxHighlighter поможет? Или есть другой вариант, как выделить определенные буквы в списке строк в QTableView... Направьте на путь истинный...  Улыбающийся

P.S.: Может посоветуете что почитать на тему делегатов, буду очень признателен.
Страниц: 1 2 [3]

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