Просмотр сообщений
|
Страниц: 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.: Может посоветуете что почитать на тему делегатов, буду очень признателен.
|
|
|
|
|