Russian Qt Forum
Март 29, 2024, 12:13
Добро пожаловать,
Гость
. Пожалуйста,
войдите
или
зарегистрируйтесь
.
Вам не пришло
письмо с кодом активации?
1 час
1 день
1 неделя
1 месяц
Навсегда
Войти
Начало
Форум
WIKI (Вики)
FAQ
Помощь
Поиск
Войти
Регистрация
Russian Qt Forum
>
Forum
>
Qt
>
Пользовательский интерфейс (GUI)
>
QTableWidget + QComboBox
Страниц: [
1
]
2
Вниз
« предыдущая тема
следующая тема »
Печать
Автор
Тема: QTableWidget + QComboBox (Прочитано 23085 раз)
muaddib1981@mail.ru
Гость
QTableWidget + QComboBox
«
:
Май 20, 2009, 10:34 »
подскажите можно в QTableWidget вместо текста встроить QComboBox.
Мне нужно чтобы редактировались фиксированные значения. И если можно то как. Спасибо.
Записан
mugabe
Гость
Re: QTableWidget + QComboBox
«
Ответ #1 :
Май 20, 2009, 10:48 »
http://doc.crossplatform.ru/qt/4.5.0/model-view-delegate.html
Записан
muaddib1981@mail.ru
Гость
Re: QTableWidget + QComboBox
«
Ответ #2 :
Май 20, 2009, 11:04 »
м-м-м, спасибо. Буду изучать.
Записан
break
Гипер активный житель
Offline
Сообщений: 846
Re: QTableWidget + QComboBox
«
Ответ #3 :
Май 20, 2009, 23:11 »
простой вариант реализации дляп примера:
h файл:
Код:
#ifndef __COMBO_DELEGATE_H__
#define __COMBO_DELEGATE_H__
#include <QItemDelegate>
class CCombo_Delegate : public QItemDelegate
{
Q_OBJECT;
QHash<int, QString> m_values;
public:
CCombo_Delegate( 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;
void paint( QPainter * painter, const QStyleOptionViewItem &option,
const QModelIndex &index ) const;
inline QHash<int, QString>& values() { return m_values; }
};
#endif // __COMBO_DELEGATE_H__
cpp файл:
Код:
#include "Combo_Delegate.h"
#include <QPainter>
#include <QComboBox>
CCombo_Delegate::CCombo_Delegate( QObject *parent ) : QItemDelegate(parent)
{
}
QWidget * CCombo_Delegate::createEditor( QWidget * parent,
const QStyleOptionViewItem& /* option */,
const QModelIndex& /* index */) const
{
QComboBox * pEditor = new QComboBox( parent );
QHash<int, QString>::const_iterator i = m_values.constBegin();
while ( i != m_values.constEnd() )
{
pEditor -> addItem( i.value(), i.key() );
++i;
}
pEditor -> installEventFilter( const_cast<CCombo_Delegate*>( this ) );
return pEditor;
}
void CCombo_Delegate::setEditorData( QWidget * editor, const QModelIndex &index) const
{
int value = index.model()->data( index, Qt::EditRole ).toInt();
QComboBox * cb = static_cast<QComboBox*>( editor );
int idx = cb->findData( value );
if ( idx < 0 ) return;
cb->setCurrentIndex( idx );
}
void CCombo_Delegate::setModelData( QWidget * editor,
QAbstractItemModel *model,
const QModelIndex& index) const
{
QComboBox * cb = static_cast<QComboBox*>( editor );
int idx = cb->currentIndex();
if ( idx < 0 ) return;
int value = cb->itemData( idx ).toInt();
model->setData( index, value );
}
void CCombo_Delegate::updateEditorGeometry( QWidget *editor,
const QStyleOptionViewItem &option,
const QModelIndex& /* index */) const
{
editor->setGeometry( option.rect );
}
void CCombo_Delegate::paint( QPainter * painter, const QStyleOptionViewItem &option,
const QModelIndex &index ) const
{
QStyleOptionViewItem opt = option;
int value = index.data().toInt();
QString s = m_values[ value ];
QVariant color = index.data( Qt::TextColorRole );
if ( color.isValid() && qvariant_cast<QColor>(color).isValid() )
opt.palette.setColor( QPalette::Text, qvariant_cast<QColor>(color) );
opt.displayAlignment = Qt::AlignVCenter | Qt::AlignLeft;
drawDisplay(painter, opt, opt.rect, s);
drawFocus(painter, opt, opt.rect);
}
пример использования с QTableView
Код:
QSqlRecord rec = m_SqlTableModel.record();
CCombo_Delegate * pCombo_Delegate = new CCombo_Delegate( &m_TableView );
pCombo_Delegate->values().insert( 1, "первое значение" );
pCombo_Delegate->values().insert( 2, "второе значение" );
pCombo_Delegate->values().insert( 3, "и т.д." );
m_TableView.setItemDelegateForColumn( rec.indexOf("SOME_FIELD"), pCombo_Delegate );
Записан
chu
Гость
Re: QTableWidget + QComboBox
«
Ответ #4 :
Декабрь 15, 2010, 15:35 »
Выходит, что для того чтобы заменить ячейку в таблице на элементарный комбо-бокс (выбор между значениями: А или Б),
нужно приписывать к своей программе огромный кусок описания делегата?...
Может быть есть другие более простые и удобные методы?
Записан
break
Гипер активный житель
Offline
Сообщений: 846
Re: QTableWidget + QComboBox
«
Ответ #5 :
Декабрь 16, 2010, 00:14 »
Цитировать
огромный кусок
Покажите мне этот огромный кусок? 10 строк кода это много? Там реально их не больше - остальное издержки описания виртуальных функций C++.
Цитировать
Может быть есть другие более простые и удобные методы?
Может есть какой-то сторонний TableView в котором есть куча опций в том числе вшитые комбобоксы... Со стандартным этот подход подразумевался разработчиками.
Записан
brankovic
Гость
Re: QTableWidget + QComboBox
«
Ответ #6 :
Декабрь 22, 2010, 21:20 »
QAbstractItemView::openPersistentEditor делает так, что редактор ячейки отображается постоянно.
Записан
chu
Гость
Re: QTableWidget + QComboBox
«
Ответ #7 :
Февраль 03, 2011, 14:49 »
В QTableWidget есть функция
Код:
void QTableWidget::setCellWidget ( int row, int column, QWidget * widget )
В самый раз для вставки comboBox!
В QTableView её можно как-нибудь запилить?
Записан
Etud
Гость
Re: QTableWidget + QComboBox
«
Ответ #8 :
Февраль 03, 2011, 15:53 »
Цитата: break от Декабрь 16, 2010, 00:14
10 строк кода это много?
1 байт уже много.
Для каждого писка писать свой напильник !
Вначале надо проверить известные методы и их применить.
Вот
chu
верно написал.
Записан
break
Гипер активный житель
Offline
Сообщений: 846
Re: QTableWidget + QComboBox
«
Ответ #9 :
Февраль 06, 2011, 03:26 »
Цитировать
Вот chu верно написал.
Неверно, хотите простоты - юзайте QTableWidget и не лезте в модель представление.
Хотите универсальности и отделенности модели от представления - делайте так как запланировали разработчики, объявляя новый класс для своего делегата и каждый раз вставляя эти 10 строк кода.
Цитировать
1 байт уже много.
А тут можно поспорить и еще как
Вставляя в каждую ячейку таблицы новый экземпляр виджета (setCellWidget) вы получаете громадный перерасход памяти по сравнению с использованием делегата который будет 1 раз создан и использоваться для всего столбца.
Удачи в чтении документации...
Записан
serg_hd
Хакер
Offline
Сообщений: 668
Re: QTableWidget + QComboBox
«
Ответ #10 :
Февраль 06, 2011, 03:51 »
Цитата: chu от Февраль 03, 2011, 14:49
В QTableWidget есть функция
Код:
void QTableWidget::setCellWidget ( int row, int column, QWidget * widget )
В самый раз для вставки comboBox!
В QTableView её можно как-нибудь запилить?
Можно. Метод setIndexWidget(const QModelIndex & index, QWidget * widget), унаследованный от того же QAbstractItemView, кстати.
«
Последнее редактирование: Февраль 06, 2011, 03:54 от serg_hd
»
Записан
kubuntu/Win7/x64/NetBeans
Etud
Гость
Re: QTableWidget + QComboBox
«
Ответ #11 :
Февраль 06, 2011, 15:11 »
Цитата: break
Неверно, хотите простоты - юзайте QTableWidget и не лезте в модель представление.
По сабжу и был QTableWidget.
Цитата: break
Хотите универсальности и отделенности модели от представления - делайте так как запланировали разработчики, объявляя новый класс для своего делегата и каждый раз вставляя эти 10 строк кода.
Только принцип - наследование в простых случаях (малая таблица)
ведет к разрастанию файлов проекта. Т.е. еще + 2 файла.
Цитата: break
Вставляя в каждую ячейку таблицы новый экземпляр виджета (setCellWidget) вы получаете громадный перерасход памяти по сравнению с использованием делегата который будет 1 раз создан и использоваться для всего столбца.
Наверное Вы правы, но не во всех случаях.
Цитата: break
Удачи в чтении документации...
И всем того же !
Записан
break
Гипер активный житель
Offline
Сообщений: 846
Re: QTableWidget + QComboBox
«
Ответ #12 :
Февраль 06, 2011, 16:05 »
Цитировать
Только принцип - наследование в простых случаях (малая таблица)
ведет к разрастанию файлов проекта. Т.е. еще + 2 файла.
И что?
Записан
shirushizo
Гость
Re: QTableWidget + QComboBox
«
Ответ #13 :
Февраль 06, 2011, 22:56 »
Согласен. 10 строк кода, еще 2 файла в проекте - ничего страшного, просто бывает лень. И от Q*Widget стоит отказать в пользу MVC - пару дней изучения и потом полная свобода действий (хотя с drag'n'drop проблемы были). Так что дерзайте и не бойтесь трудностей
Записан
spirits25
Гость
Re: QTableWidget + QComboBox
«
Ответ #14 :
Январь 19, 2012, 14:44 »
Для питона ни у кого нет случайно примера, как QComboBox вставить в QTableWidget?
Спасибо, нашёл сам. Или дошёл, не знаю=)
«
Последнее редактирование: Январь 19, 2012, 16:48 от spirits25
»
Записан
Страниц: [
1
]
2
Вверх
Печать
« предыдущая тема
следующая тема »
Перейти в:
Пожалуйста, выберите назначение:
-----------------------------
Qt
-----------------------------
=> Вопросы новичков
=> Уроки и статьи
=> Установка, сборка, отладка, тестирование
=> Общие вопросы
=> Пользовательский интерфейс (GUI)
=> Qt Quick
=> Model-View (MV)
=> Базы данных
=> Работа с сетью
=> Многопоточное программирование, процессы
=> Мультимедиа
=> 2D и 3D графика
=> OpenGL
=> Печать
=> Интернационализация, локализация
=> QSS
=> XML
=> Qt Script, QtWebKit
=> ActiveX
=> Qt Embedded
=> Дополнительные компоненты
=> Кладовая готовых решений
=> Вклад сообщества в Qt
=> Qt-инструментарий
-----------------------------
Программирование
-----------------------------
=> Общий
=> С/C++
=> Python
=> Алгоритмы
=> Базы данных
=> Разработка игр
-----------------------------
Компиляторы и платформы
-----------------------------
=> Linux
=> Windows
=> Mac OS X
=> Компиляторы
===> Visual C++
-----------------------------
Разное
-----------------------------
=> Новости
===> Новости Qt сообщества
===> Новости IT сферы
=> Говорилка
=> Юмор
=> Объявления
Загружается...