С Новым годом! Форум программистов, компьютерный форум, киберфорум
C++ Qt
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.89/89: Рейтинг темы: голосов - 89, средняя оценка - 4.89
39 / 39 / 17
Регистрация: 14.10.2013
Сообщений: 174
1

QComboBox delegate, динамический список

31.10.2014, 13:03. Показов 16053. Ответов 1
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Добрый времени. Хочу установить в колонку QTableWidget-а комбобоксы.
Подглядев примеры сделал делегат ComboBoxDelegat, выглядит так:
header
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <QItemDelegate>
#include <QModelIndex>
#include <QObject>
#include <QSize>
#include <QComboBox>
 
class ComboBoxDelegate : public QItemDelegate
{
    Q_OBJECT
 
public:
    ComboBoxDelegate(QObject *parent = 0);
 
    QWidget *createEditor(QWidget *parent, const QStyleOptionViewItem &option,
                          const QModelIndex &index) const;
 
    void setEditorData(QWidget *editor, const QModelIndex &index) const;
    void setModelData(QWidget *editor, QAbstractItemModel *model,
                      const QModelIndex &index) const;
 
    void updateEditorGeometry(QWidget *editor,
        const QStyleOptionViewItem &option, const QModelIndex &index) const;
};
cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
#include <QtGui>
#include "comboboxdelegae.h"
 
ComboBoxDelegate::ComboBoxDelegate(QObject *parent)
    : QItemDelegate(parent)
{
}
 
QWidget *ComboBoxDelegate::createEditor(QWidget *parent,
    const QStyleOptionViewItem &/* option */,
    const QModelIndex &/* index */) const
{
    QComboBox *editor = new QComboBox(parent);
    
    return editor;
}
 
 
void ComboBoxDelegate::setEditorData(QWidget *editor,
                                    const QModelIndex &index) const
{
    QString value = index.model()->data(index, Qt::EditRole).toString();
 
    QComboBox *comboBox = static_cast<QComboBox*>(editor);
    comboBox->addItem(value);
}
 
 
void ComboBoxDelegate::setModelData(QWidget *editor, QAbstractItemModel *model,
                                   const QModelIndex &index) const
{
    QComboBox *comboBox = static_cast<QComboBox*>(editor);
    QString value = comboBox->itemText(comboBox->currentIndex());
    model->setData(index, value, Qt::EditRole);
}
 
 
void ComboBoxDelegate::updateEditorGeometry(QWidget *editor,
    const QStyleOptionViewItem &option, const QModelIndex &/* index */) const
{
    editor->setGeometry(option.rect);
}
Делегат в таблице работает нормально. Но суть в том, что список который отображает ComboBox динамический, некоторые элементы должны удаляться и добавляться новые. Где и как нужно описать методы для коррекции списка комбобокса?

Добавлено через 1 час 30 минут
Докурил сам. В делегате добавил QStringList, и в методе делегата createEditor переношу список в сам комбоящик.
Добавлять\удалять елементы обращаясь к QStringList через указатель делегата.
Пошел напильничком доработаю. Извините за беспокойства.

Добавлено через 17 часов 39 минут
Все же добавление элементов в список проходит странно. При заполнении списка, в конце всегда есть 1 пустой элемент, который постоянно меняет значение на последнее установленное в комбобоксе, и не удаляется при очистке списка элементов комбобокса. Буду благодарен если кто пнет в нужную сторону.
В классе делегата объявлен public QStringList, к которому я обращаюсь из QMainWindow для управления элементами, заполнения списка в делегате происходит здесь:
C++
1
2
3
4
5
6
7
8
9
10
11
QWidget *ComboBoxDelegate::createEditor(QWidget *parent,
    const QStyleOptionViewItem &/* option */,
    const QModelIndex &/* index */) const
{
    QComboBox *editor = new QComboBox(parent);
 
    editor->clear();
    editor->insertItems(editor->count(), itemsList);
 
    return editor;
}
Добавлено через 8 минут
С этим тоже разобрался, лишний странный элемент появлялся из этого метода:
C++
1
2
3
4
5
6
7
8
void ComboBoxDelegate::setEditorData(QWidget *editor,
                                    const QModelIndex &index) const
{
    QString value = index.model()->data(index, Qt::EditRole).toString();
 
    QComboBox *comboBox = static_cast<QComboBox*>(editor);
    comboBox->addItem(value);
}
Остался только один нюанс наверное, например когда делегат с выбранным значением существует в ячейке таблицы, и дальше я очищаю список элементов комбобокса, как вызвать что бы обновилось значение в таблице(обнулилось?), так как оно остается старым, пока не открыть ячейку таблицы для редактирования.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
31.10.2014, 13:03
Ответы с готовыми решениями:

3 QComboBox и 1 список
Доброго времени суток. Есть задача, получать в программе список всех com-портов и выбирать 3 из...

Отсортировать динамический список, используя основной (заполненный) и второй пустой список
Вроде бы сделал, но почему-то пропадает первый элемент... Иногда последний, не могу отследить... Не...

Динамический список
Вот есть класс..совсем не замысловатый! ...

Динамический список
помогите пожалуйста решить задачу: Динамический список (2 класса: элемент списка и список,...

1
39 / 39 / 17
Регистрация: 14.10.2013
Сообщений: 174
04.11.2014, 18:28  [ТС] 2
Возвращаясь к теме, кто знает, можно ли при смене содержимого списка делегата ComboBox-a, убрать из ячеек уже не существующие значения? Либо самому перебирать столбец проверяя ячейки на значение которое удалил из списка?
Так же вопрос, можно ли при заполнении таблицы программно, установить в ячейку первое значение из делегата? Инициализировать так сказать. Намекните если неясно спрашиваю, спасибо.
0
04.11.2014, 18:28
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
04.11.2014, 18:28
Помогаю со студенческими работами здесь

Динамический список
пожалуйста если можно подскажите как создать динамический список в классе C++ (если можно с...

Динамический список
Составить программу которая выполняет следующие действия: 1. Создает динамический список 2....

динамический список
Всем здраствуйте . В проге надо создать динамический список и реализовать всякие функции для...

Динамический список
android studio - java Привет. Есть в as какая нибудь удобная штука, чтоб можно было просто...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Новые блоги и статьи
Книги и учебные ресурсы по C#
InfoMaster 08.01.2025
Базовые учебники и руководства Одной из лучших книг для начинающих является "C# 10 и . NET 6 для начинающих" Эндрю Троелсена и Филиппа Джепикса . Книга последовательно раскрывает основные концепции. . .
Что такое NullReferenceEx­­­ception и как исправить?
InfoMaster 08.01.2025
NullReferenceException - одно из самых распространенных исключений, с которым сталкиваются разработчики на C#. Это исключение возникает при попытке обратиться к членам объекта (методам, свойствам или. . .
Что такое Null Pointer Exception (NPE) и как это исправить?
InfoMaster 08.01.2025
Null Pointer Exception (NPE) - это одно из самых распространенных исключений в Java, которое возникает при попытке использовать ссылку на объект, значение которой равно null. Это исключение относится. . .
Русский язык в консоли C++
InfoMaster 08.01.2025
При разработке программ на C++ одной из частых проблем, с которой сталкиваются русскоязычные программисты, является корректное отображение кириллицы в консольных приложениях. Эта проблема особенно. . .
Telegram бот на C#
InfoMaster 08.01.2025
Разработка ботов для Telegram стала неотъемлемой частью современной экосистемы мессенджеров. C# предоставляет мощный и удобный инструментарий для создания разнообразных ботов, от простых. . .
Использование GraphQL в Go (Golang)
InfoMaster 08.01.2025
Go (Golang) является одним из наиболее популярных языков программирования, используемых для создания высокопроизводительных серверных приложений. Его архитектурные особенности и встроенные. . .
Что лучше использовать при создании класса в Java: сеттеры или конструктор?
Alexander-7 08.01.2025
Вопрос подробнее: На вопрос: «Когда одновременно создаются конструктор и сеттеры в классе – это нормально?» куратор уточнил: «Ваш класс может вообще не иметь сеттеров, а только конструктор и геттеры. . .
Как работать с GraphQL на TypeScript
InfoMaster 08.01.2025
Введение в GraphQL и TypeScript В современной разработке веб-приложений GraphQL стал мощным инструментом для создания гибких и эффективных API. В сочетании с TypeScript, эта технология. . .
Счётчик на базе сумматоров + регистров и генератора сигналов согласования.
Hrethgir 07.01.2025
Создан с целью проверки скорости асинхронной логики: ранее описанного сумматора и предополагаемых fast регистров. Регистры созданы на базе ранее описанного, предполагаемого fast триггера. То-есть. . .
Как перейти с Options API на Composition API в Vue.js
BasicMan 06.01.2025
Почему переход на Composition API актуален В мире современной веб-разработки фреймворк Vue. js продолжает эволюционировать, предлагая разработчикам все более совершенные инструменты для создания. . .
Архитектура современных процессоров
inter-admin 06.01.2025
Процессор (центральный процессор, ЦП) является основным вычислительным устройством компьютера, которое выполняет обработку данных и управляет работой всех остальных компонентов системы. Архитектура. . .
История создания реляционной модели баз данных, правила Кодда
Programming 06.01.2025
Предпосылки создания реляционной модели В конце 1960-х годов компьютерная индустрия столкнулась с серьезными проблемами в области управления данными. Существовавшие на тот момент модели данных -. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru