Arrow
ArrowШілде 6, 2018, 6:09 Т.Ж.

Наследование от QLineEdit

QLineEdit

Добрый день!

Наследуюсь от класса QLineEdit (новый класс LineWidget) , переопределяю несколько функций.
Сейчас возник вопрос:  необходимо изменить цвет фона в зависимости от текста в виджете ( необходимо выполнять каждый раз при изменении текста в виджете ).
LineWidget связан с полем в базе данных через QDataWidgetMapper ( первый раз текст в виджете меняет маппер ).
Как возможно это реализовать, какой метод переопределить?

Пытался переопределить setText() - не работает, текст маппер в виджете меняет, но фон не меняется.
Рекомендуем хостинг TIMEWEB
Рекомендуем хостинг TIMEWEB
Стабильный хостинг, на котором располагается социальная сеть EVILEG. Для проектов на Django рекомендуем VDS хостинг.

Ол саған ұнайды ма? Әлеуметтік желілерде бөлісіңіз!

26
Evgenii Legotckoi
  • Шілде 6, 2018, 6:12 Т.Ж.

Добрый день!

Я правильно понимаю, что текст в LineWidget должен быть шестнадцатеричным представлением цвета?
Будет неплохо, если код этого LineWidget прикрепите, заголовочный файл и исходник

    Arrow
    • Шілде 6, 2018, 6:38 Т.Ж.
    • (өңделген)
    Все правильно.

    Заголовочный файл:

    #ifndef CLICKELINEEDIT_H
    #define CLICKELINEEDIT_H
    
    #include <QWidget>
    #include <QLineEdit>
    
    class ClickeLineEdit : public QLineEdit
    {
        Q_OBJECT
    
    public:
        explicit ClickeLineEdit(QWidget *parent = Q_NULLPTR);
        explicit ClickeLineEdit(const QString &text, QWidget *parent = Q_NULLPTR);
        ~ClickeLineEdit();
    
    protected:
        void mousePressEvent(QMouseEvent *event) override;
    
    public Q_SLOTS:
        void setText(const QString &text);
    };
    
    #endif // CLICKELINEEDIT_H

    Файл реализации:

    #include "clickelineedit.h"
    
    #include <QColorDialog>
    #include <QColor>
    
    ClickeLineEdit::ClickeLineEdit(const QString &text, QWidget *parent)
            : QLineEdit(text, parent)
    {
    }
    
    ClickeLineEdit::ClickeLineEdit(QWidget *parent)
            : QLineEdit(parent)
    {
    }
    
    ClickeLineEdit::~ClickeLineEdit()
    {
    }
    
    void ClickeLineEdit::mousePressEvent(QMouseEvent *event)
    {
        QColor color = QColorDialog::getColor(text(), this);
        setText(color.name());

    QLineEdit::mousePressEvent(event); } void ClickeLineEdit::setText(const QString &text) { if (QColor(text).isValid()) { setStyleSheet("ClickeLineEdit { background-color: " + text + ";} "); } QLineEdit::setText(text); }

      Evgenii Legotckoi
      • Шілде 6, 2018, 7:03 Т.Ж.

      StyleSheet неправильно написан. Надо так

      void ClickeLineEdit::setText(const QString &text)
      {
          if (QColor(text).isValid()) {
              setStyleSheet("QLineEdit { background-color: " + text + ";}");
          }
          QLineEdit::setText(text);
      }
        Arrow
        • Шілде 6, 2018, 8:52 Т.Ж.

        Спасибо! Работает и мое и Ваше , но только при обработке события клика на виджете (когда setText() вызывается в

        mousePressEvent()
        ), а при загрузке данных маппером в виджет  - нет.
          Evgenii Legotckoi
          • Шілде 6, 2018, 8:56 Т.Ж.

          У меня ваш вариант не сработал, наверное из-за того, что я запускал этот код под дистрибутивом KDE neon.

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




            Arrow
            • Шілде 6, 2018, 9:08 Т.Ж.

            А можно пример.

              Arrow
              • Шілде 7, 2018, 11:15 Т.Ж.
              • (өңделген)

              Можно ещё один вопрос не по теме,  но все-же. Есть QListViw со списком элементов, как можно получить индекс элемента по его тексту? Пытался найти вопрос в документации,  но ничего не нашёл. 

                Evgenii Legotckoi
                • Шілде 8, 2018, 3 Т.Қ.

                вы уже реализовывали работу с QItemDelegate , а у маппера есть метод setItemDelegate. Помните тот вопрос?

                Так вот, думаю, что можно переопределить метод у делегата и отрисовать фон уже в зависимости от содержимого.
                Пример может быть позже, сейчас как-то не особо с мыслями на этот счёт.
                  Evgenii Legotckoi
                  • Шілде 8, 2018, 3:05 Т.Қ.

                  В зависимости от модели данных, в QListView может находиться, что угодно, хоть хитровыделанные объекты с изображениями, поэтому логично, что в QListView нет такого механизма, чтобы по тексту получить индекс. Вам нужно писать поиск либо по модели данных либо по этому QListView нужной строки, и уже с помощью неё делать индекс

                    Arrow
                    • Шілде 8, 2018, 3:10 Т.Қ.

                    Понял, буду с QListView выкручиваться. Вопрос помню перелопатил документацию, но нигде нет информации как маппер данные в виджеты впихивает.

                      Evgenii Legotckoi
                      • Шілде 8, 2018, 3:50 Т.Қ.

                      Маппер должен вызывать методы и , там уже специализированная логика для различных виджетов должна быть.

                        Arrow
                        • Шілде 8, 2018, 4:02 Т.Қ.
                        • (өңделген)

                        Да похоже у него есть фильтрация т.к. к нему подсоединить можно любой виджет, но данные он заносит только в поля ввода, комбобокс и лейбл. Только какие методы использует неясно. В QLineEdit textChanged срабатывает, но только когда маппер данные занес, при этом похоже что setText он не использует.

                          Arrow
                          • Шілде 9, 2018, 2:35 Т.Ж.
                          • (өңделген)
                          Я подумал, что возможно намудрил с  QListView. Я использую его для показа столбца таблицы из базы данных и когда пользователь выберет несколько срок их индексы нужно записать в столбец главной таблицы. И при новой попытке редактирования записи должнен показываться QListView, только уже выбранные строки должны быть выделенными.

                          Я пока пробую обработать это все для единичного выбора (не знаю какой тип использовать для ячейки в базе для множественного).

                          Натворил такое:

                          groupModel = new BaseComboModel("name", "groups", this, Table, "group_area"); // Модель
                          ui->groupAreaListView->setModel(groupModel);
                          ui->groupAreaListView->setRowHidden(0, true); // по модели имеет запись (выберите вариант)
                          
                          // Запись в базу
                          auto saveListData = [&id](BaseComboModel *model, QListView *view, QString table, QString column)
                          {
                              QModelIndex index = view->currentIndex();
                              QString itemText = index.data(Qt::DisplayRole).toString();
                          
                              QString str = QString("SELECT id FROM " + table + " WHERE " + column + " = '%1'").arg(itemText);
                              QSqlQuery query;
                              query.exec(str);
                              query.next(); // Что-то не так
                              model->saveToDB(query.value(0).toInt(), id); // Описана в модели
                          };
                          
                          saveListData(groupModel, ui->groupAreaListView, GroupsTable, "name");
                          saveListData(docModel, ui->docGroupListView, DocTable, "group_name");


                          И затем при загрузке хочу из таблицы базы по id строки вытянуть ее текст и выделить его в QListView. (но выделить по тексту нельзя, вот для этого и нужен индекс записи).

                          И пока не понял в чем проблема но первая запись
                          saveListData(groupModel, ui->groupAreaListView, GroupsTable, "name");

                          отрабатывает и данные записываются, а вот вторая
                          saveListData(docModel, ui->docGroupListView, DocTable, "group_name");
                          при ее отработке выходит следующее
                          query.next(); // установлено на неверную запись
                          model->saveToDB(query.value(0).toInt(), id); // здесь всегда 0

                          Может я что-то не так делаю. Почему по отдельности это работает (без лямбды) а вместе отрабатывает только первая запись.
                            Evgenii Legotckoi
                            • Шілде 10, 2018, 3:15 Т.Ж.

                            Возможно, не совсем корректно формируется строка QString. Не знаю почему, но такое поведение проскакивает, когда работаете с базой данных.

                            А вообще не хорошо кобинировать arg и конкатенацию строк. Лучше писать всё через arg.


                            Перепишите так.

                            QString str = QString("SELECT id FROM '%1' WHERE '%2' = '%3'").arg(table).arg(column).arg(itemText);

                            Это если действительно только с лямбдой не работает. Кстати, если вы захватываете id по ссылке и что-то делаете с ним в методе saveToDB, также передавая по ссылке его, то не может быть так, что вы в том методе его изменяете?
                              Arrow
                              • Шілде 10, 2018, 3:29 Т.Ж.
                              • (өңделген)

                              Запрос формируется верно в обоих случаях,  только при выполнении лямбды второй раз запрос сформирован верно, а ответа нет - query установлено на неверную запись. Пробовал писать вместо next - last,  first - результат тот-же.

                                Arrow
                                • Шілде 10, 2018, 4:11 Т.Ж.
                                Ничего не пойму - под Windows 7 это работает прекрасно, а под Debian Linux - нет.

                                Подскажите, пожалуйста, по второй части вопроса: какой тип использовать для ячейки в базе данных для записи информации о множественном выборе строк в QListView и как можно при редактировании записи выделить выбранные (в прошлый раз) сроки.
                                  Evgenii Legotckoi
                                  • Шілде 10, 2018, 1:02 Т.Қ.

                                  Если в том QListView модель данных таблицы из записей в базе данных, то можно воспользоваться id тех записей.

                                  Здесь думаю, можно было бы воспользоваться OneToMany связями и иметь дополнительную таблицу под названием Selections, который бы хранил выделения, и вторую таблицу SelectedObjects, которая бы хранила информацию об id выделенных объектов, и внешний ключ на id выделения Selection. То есть SelectedObjects будет промежуточной таблицей между таблицей выделений и таблице целевых объектов.




                                  То есть одним полем тут не обойтись.
                                  Ну или я не совсем правильно понял вопрос...
                                    Arrow
                                    • Шілде 10, 2018, 2:31 Т.Қ.
                                    • (өңделген)

                                    Не знаю, может мы и поняли друг друга не верно. Попробую описать это на примере.

                                    Есть таблица пользователей:
                                    Поля таблицы users:
                                    id (integer, autoinc, unique)
                                    name (text, not null, unique)
                                    passord (text)
                                    group (какой-то тип для хранения id выделенных записей из таблицы groups)

                                    Таблица групп:
                                    Поля таблицы groups:
                                    id (integer, autoinc, unique)
                                    name (text, not null, unique)
                                    type (text)

                                    Пользователь может входить в несколько групп.
                                    Так вот в QListView отображается поле "name" таблицы "groups". а результаты віделения "id" из таблицы groups должны записываться в поле "group" таблицы "users".

                                    На форме располагается таблица с данными из "users". Пользователь выбирает создать новую или редактировать существующую запись и  отображается форма с полями ввода и QListView. Пользователь может выделить несколько записей в QListView и сохранить данные. А при повторном редактировании эти-же записи в QListView уже должны быть выделены.
                                    Вот это все выше описанное и пытаюсь реализовать.

                                    Может использовать что-то похожее на тип array - пример из документации  PostgreSQL:

                                    INSERT INTO sal_emp VALUES ( '{10000, 10000, 10000, 10000}' );

                                    В общем объяснил как смог. Извините за возможные неточности.

                                      Evgenii Legotckoi
                                      • Шілде 10, 2018, 3:34 Т.Қ.
                                      • (өңделген)

                                      Да, я понял правильно.

                                      Вам нужно создать третью таблицу в которой будет три поля и назвать её допустим так UsersInGroups. Эта таблица будет реализовывать связи ManyToMany.
                                      Поля которые в неё должны будут быть
                                      id (integer, autoinc, unique )- уникальный id записи в таблицы
                                      user_id (integer, foreign key )-- id пользователя, внешний ключ на пользователя
                                      group_id (integer, foreign key )- id группы, внешний ключ на группу
                                      Именно так и нужно реализовывать такую структуру в реляционной базе данных.
                                      Array из PostgeSQL точно здесь не нужен, он скорее подойдет для древовидных структур при использовании шаблона Materialized Path , для комментариев на странице сайта например.








                                        Arrow
                                        • Шілде 11, 2018, 3:27 Т.Ж.

                                        Спасибо! Понял, так и буду делать. Только пока не совсем понял, как быть с выделение данных в QListView при редактировании существующей записи.

                                          Evgenii Legotckoi
                                          • Шілде 11, 2018, 3:37 Т.Ж.

                                          Там скорее нужно делать сырой Query запрос, находить все id для выделения, потом через проход по списку искать нужные записи, найдя все нужные QModelIndex делать выделение.

                                            Arrow
                                            • Шілде 11, 2018, 3:41 Т.Ж.

                                            Понятно. А есть возможность чем-то заменить QListView, чтобы уйти от этого?

                                              Evgenii Legotckoi
                                              • Шілде 11, 2018, 3:45 Т.Ж.

                                              От чего именно уйти? От необходимости реализовывать логику выделения? Это нестандартный функционал, так что нет, чем бы Вы не заменили QListView, например QTableView или QTreeView, логику выделения всё равно писать придётся самостоятельно.

                                                Arrow
                                                • Шілде 11, 2018, 10:07 Т.Ж.
                                                Если кому-то понадобится выкладываю свой вариант решения.

                                                Сохранение данных:
                                                auto saveListData = [&id](QModelIndexList list, QString table, QString column)
                                                {
                                                   for (QModelIndex index : list) {
                                                      int itemId = index.data(Qt::UserRole).toInt();
                                                      QString str = QString("INSERT INTO %1 (user_id, %2) VALUES (%3, %4)").arg(table).arg(column).arg(id).arg(itemId);
                                                      QSqlQuery query;
                                                      query.exec(str);
                                                   }
                                                };
                                                saveListData(ui->groupAreaListView->selectionModel()->selectedIndexes(), "users_in_groups", "group_id");
                                                saveListData(ui->docGroupListView->selectionModel()->selectedIndexes(), "users_in_doc", "doc_group_id");

                                                Загрузка данных:
                                                auto loadListData = [&id](QListView *view, QString table, QString column)
                                                { QString str = QString("SELECT %1 FROM %2 WHERE user_id = %3").arg(column).arg(table).arg(id); QSqlQuery query; query.exec(str); QList<int> list; while (query.next()) { list.append(query.value(0).toInt()); } for (int i = 0; i < view->model()->rowCount(); i++) { QModelIndex index = view->model()->index(i, 0); for (int value : list) { if (view->model()->data(index, Qt::UserRole).toInt() == value) { view->selectionModel()->select(index, QItemSelectionModel::Select); } } } }; loadListData(ui->groupAreaListView, "users_in_groups", "group_id"); loadListData(ui->docGroupListView, "users_in_doc", "doc_group_id");
                                                  Arrow
                                                  • Шілде 11, 2018, 10:09 Т.Ж.

                                                  Огромное спасибо за помощь и подсказки !!!

                                                    Ruslan Polupan
                                                    • Шілде 11, 2018, 12:05 Т.Қ.

                                                    Из опыта разработки в нашей конторе (для программирование хобби я техподдержка): Если есть возможность переложить логику приложения на базу данных то это лутший вариант. Т.е. использовать по максимуму все возможности сервера БД.

                                                      Пікірлер

                                                      Тек рұқсаты бар пайдаланушылар ғана пікір қалдыра алады.
                                                      Кіріңіз немесе Тіркеліңіз
                                                      AD

                                                      C++ - Тест 004. Указатели, Массивы и Циклы

                                                      • Нәтиже:50ұпай,
                                                      • Бағалау ұпайлары-4
                                                      m
                                                      • molni99
                                                      • Қаз. 26, 2024, 1:37 Т.Ж.

                                                      C++ - Тест 004. Указатели, Массивы и Циклы

                                                      • Нәтиже:80ұпай,
                                                      • Бағалау ұпайлары4
                                                      m
                                                      • molni99
                                                      • Қаз. 26, 2024, 1:29 Т.Ж.

                                                      C++ - Тест 004. Указатели, Массивы и Циклы

                                                      • Нәтиже:20ұпай,
                                                      • Бағалау ұпайлары-10
                                                      Соңғы пікірлер
                                                      ИМ
                                                      Игорь МаксимовҚар. 22, 2024, 11:51 Т.Ж.
                                                      Django - Оқулық 017. Теңшелген Django кіру беті Добрый вечер Евгений! Я сделал себе авторизацию аналогичную вашей, все работает, кроме возврата к предидущей странице. Редеректит всегда на главную, хотя в логах сервера вижу запросы на правильн…
                                                      Evgenii Legotckoi
                                                      Evgenii LegotckoiҚаз. 31, 2024, 2:37 Т.Қ.
                                                      Django - Сабақ 064. Python Markdown кеңейтімін қалай жазуға болады Добрый день. Да, можно. Либо через такие же плагины, либо с постобработкой через python библиотеку Beautiful Soup
                                                      A
                                                      ALO1ZEҚаз. 19, 2024, 8:19 Т.Ж.
                                                      Qt Creator көмегімен fb3 файл оқу құралы Подскажите как это запустить? Я не шарю в программировании и кодинге. Скачал и установаил Qt, но куча ошибок выдается и не запустить. А очень надо fb3 переконвертировать в html
                                                      ИМ
                                                      Игорь МаксимовҚаз. 5, 2024, 7:51 Т.Ж.
                                                      Django - Сабақ 064. Python Markdown кеңейтімін қалай жазуға болады Приветствую Евгений! У меня вопрос. Можно ли вставлять свои классы в разметку редактора markdown? Допустим имея стандартную разметку: <ul> <li></li> <li></l…
                                                      d
                                                      dblas5Шілде 5, 2024, 11:02 Т.Ж.
                                                      QML - Сабақ 016. SQLite деректер қоры және онымен QML Qt-та жұмыс істеу Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
                                                      Енді форумда талқылаңыз
                                                      m
                                                      moogoҚар. 22, 2024, 7:17 Т.Ж.
                                                      Mosquito Spray System Effective Mosquito Systems for Backyard | Eco-Friendly Misting Control Device & Repellent Spray - Moogo ; Upgrade your backyard with our mosquito-repellent device! Our misters conce…
                                                      Evgenii Legotckoi
                                                      Evgenii LegotckoiМаусым 24, 2024, 3:11 Т.Қ.
                                                      добавить qlineseries в функции Я тут. Работы оень много. Отправил его в бан.
                                                      t
                                                      tonypeachey1Қар. 15, 2024, 6:04 Т.Ж.
                                                      google domain [url=https://google.com/]domain[/url] domain [http://www.example.com link title]
                                                      NSProject
                                                      NSProjectМаусым 4, 2022, 3:49 Т.Ж.
                                                      Всё ещё разбираюсь с кешем. В следствии прочтения данной статьи. Я принял для себя решение сделать кеширование свойств менеджера модели LikeDislike. И так как установка evileg_core для меня не была возможна, ибо он писался…

                                                      Бізді әлеуметтік желілерде бақылаңыз