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

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: QTableWidget + QComboBox  (Прочитано 23082 раз)
muaddib1981@mail.ru
Гость
« : Май 20, 2009, 10:34 »

подскажите можно в QTableWidget вместо текста встроить QComboBox.
Мне нужно чтобы редактировались фиксированные значения. И если можно то как. Спасибо.
Записан
mugabe
Гость
« Ответ #1 : Май 20, 2009, 10:48 »

http://doc.crossplatform.ru/qt/4.5.0/model-view-delegate.html
Записан
muaddib1981@mail.ru
Гость
« Ответ #2 : Май 20, 2009, 11:04 »

м-м-м, спасибо. Буду изучать.
Записан
break
Гипер активный житель
*****
Offline Offline

Сообщений: 846


Просмотр профиля
« Ответ #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
Гость
« Ответ #4 : Декабрь 15, 2010, 15:35 »

Выходит, что для того чтобы заменить ячейку в таблице на элементарный комбо-бокс (выбор между значениями: А или Б),
нужно приписывать к своей программе огромный кусок описания делегата?...
Может быть есть другие более простые и удобные методы?
Записан
break
Гипер активный житель
*****
Offline Offline

Сообщений: 846


Просмотр профиля
« Ответ #5 : Декабрь 16, 2010, 00:14 »

Цитировать
огромный кусок
Покажите мне этот огромный кусок? 10 строк кода это много? Там реально их не больше - остальное издержки описания виртуальных функций C++.

Цитировать
Может быть есть другие более простые и удобные методы?
Может есть какой-то сторонний TableView в котором есть куча опций в том числе вшитые комбобоксы... Со стандартным этот подход подразумевался разработчиками.
Записан
brankovic
Гость
« Ответ #6 : Декабрь 22, 2010, 21:20 »

QAbstractItemView::openPersistentEditor делает так, что редактор ячейки отображается постоянно.
Записан
chu
Гость
« Ответ #7 : Февраль 03, 2011, 14:49 »

В QTableWidget есть функция
Код:
void QTableWidget::setCellWidget ( int row, int column, QWidget * widget )
В самый раз для вставки comboBox!
В QTableView её можно как-нибудь запилить?
Записан
Etud
Гость
« Ответ #8 : Февраль 03, 2011, 15:53 »

10 строк кода это много?

1 байт уже много. Для каждого писка писать свой напильник !

Вначале надо проверить известные методы и их применить.

Вот chu верно написал.

Записан
break
Гипер активный житель
*****
Offline Offline

Сообщений: 846


Просмотр профиля
« Ответ #9 : Февраль 06, 2011, 03:26 »

Цитировать
Вот chu верно написал.
Неверно, хотите простоты - юзайте QTableWidget и не лезте в модель представление.

Хотите универсальности и отделенности модели от представления - делайте так как запланировали разработчики, объявляя новый класс для своего делегата и каждый раз вставляя эти 10 строк кода.

Цитировать
1 байт уже много.
А тут можно поспорить и еще как
Вставляя в каждую ячейку таблицы новый экземпляр виджета (setCellWidget) вы получаете громадный перерасход памяти по сравнению с использованием делегата который будет 1 раз создан и использоваться для всего столбца.

Удачи в чтении документации...
Записан
serg_hd
Хакер
*****
Offline Offline

Сообщений: 668



Просмотр профиля
« Ответ #10 : Февраль 06, 2011, 03:51 »

В 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
Гость
« Ответ #11 : Февраль 06, 2011, 15:11 »

Цитата: break
Неверно, хотите простоты - юзайте QTableWidget и не лезте в модель представление.
По сабжу и был QTableWidget.

Цитата: break
Хотите универсальности и отделенности модели от представления - делайте так как запланировали разработчики, объявляя новый класс для своего делегата и каждый раз вставляя эти 10 строк кода.
Только принцип - наследование в простых случаях (малая таблица)
ведет к разрастанию файлов проекта. Т.е. еще + 2 файла.

Цитата: break
Вставляя в каждую ячейку таблицы новый экземпляр виджета (setCellWidget) вы получаете громадный перерасход памяти по сравнению с использованием делегата который будет 1 раз создан и использоваться для всего столбца.
Наверное Вы правы, но не во всех случаях.

Цитата: break
Удачи в чтении документации...
И всем того же !  Смеющийся
Записан
break
Гипер активный житель
*****
Offline Offline

Сообщений: 846


Просмотр профиля
« Ответ #12 : Февраль 06, 2011, 16:05 »

Цитировать
Только принцип - наследование в простых случаях (малая таблица)
ведет к разрастанию файлов проекта. Т.е. еще + 2 файла.

И что?
Записан
shirushizo
Гость
« Ответ #13 : Февраль 06, 2011, 22:56 »

Согласен. 10 строк кода, еще 2 файла в проекте - ничего страшного, просто бывает лень. И от Q*Widget стоит отказать в пользу MVC - пару дней изучения и потом полная свобода действий (хотя с drag'n'drop проблемы были). Так что дерзайте и не бойтесь трудностей  Подмигивающий
Записан
spirits25
Гость
« Ответ #14 : Январь 19, 2012, 14:44 »

Для питона ни у кого нет случайно примера, как QComboBox вставить в QTableWidget?
Спасибо, нашёл сам. Или дошёл, не знаю=)
« Последнее редактирование: Январь 19, 2012, 16:48 от spirits25 » Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


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