Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: muaddib1981@mail.ru от Май 20, 2009, 10:34



Название: QTableWidget + QComboBox
Отправлено: muaddib1981@mail.ru от Май 20, 2009, 10:34
подскажите можно в QTableWidget вместо текста встроить QComboBox.
Мне нужно чтобы редактировались фиксированные значения. И если можно то как. Спасибо.


Название: Re: QTableWidget + QComboBox
Отправлено: mugabe от Май 20, 2009, 10:48
http://doc.crossplatform.ru/qt/4.5.0/model-view-delegate.html


Название: Re: QTableWidget + QComboBox
Отправлено: muaddib1981@mail.ru от Май 20, 2009, 11:04
м-м-м, спасибо. Буду изучать.


Название: Re: QTableWidget + QComboBox
Отправлено: break от Май 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 );


Название: Re: QTableWidget + QComboBox
Отправлено: chu от Декабрь 15, 2010, 15:35
Выходит, что для того чтобы заменить ячейку в таблице на элементарный комбо-бокс (выбор между значениями: А или Б),
нужно приписывать к своей программе огромный кусок описания делегата?...
Может быть есть другие более простые и удобные методы?


Название: Re: QTableWidget + QComboBox
Отправлено: break от Декабрь 16, 2010, 00:14
Цитировать
огромный кусок
Покажите мне этот огромный кусок? 10 строк кода это много? Там реально их не больше - остальное издержки описания виртуальных функций C++.

Цитировать
Может быть есть другие более простые и удобные методы?
Может есть какой-то сторонний TableView в котором есть куча опций в том числе вшитые комбобоксы... Со стандартным этот подход подразумевался разработчиками.


Название: Re: QTableWidget + QComboBox
Отправлено: brankovic от Декабрь 22, 2010, 21:20
QAbstractItemView::openPersistentEditor делает так, что редактор ячейки отображается постоянно.


Название: Re: QTableWidget + QComboBox
Отправлено: chu от Февраль 03, 2011, 14:49
В QTableWidget есть функция
Код:
void QTableWidget::setCellWidget ( int row, int column, QWidget * widget )
В самый раз для вставки comboBox!
В QTableView её можно как-нибудь запилить?


Название: Re: QTableWidget + QComboBox
Отправлено: Etud от Февраль 03, 2011, 15:53
10 строк кода это много?

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

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

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



Название: Re: QTableWidget + QComboBox
Отправлено: break от Февраль 06, 2011, 03:26
Цитировать
Вот chu верно написал.
Неверно, хотите простоты - юзайте QTableWidget и не лезте в модель представление.

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

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

Удачи в чтении документации...


Название: Re: QTableWidget + QComboBox
Отправлено: serg_hd от Февраль 06, 2011, 03:51
В QTableWidget есть функция
Код:
void QTableWidget::setCellWidget ( int row, int column, QWidget * widget )
В самый раз для вставки comboBox!
В QTableView её можно как-нибудь запилить?
Можно. Метод setIndexWidget(const QModelIndex & index, QWidget * widget), унаследованный от того же QAbstractItemView, кстати.


Название: Re: QTableWidget + QComboBox
Отправлено: Etud от Февраль 06, 2011, 15:11
Цитата: break
Неверно, хотите простоты - юзайте QTableWidget и не лезте в модель представление.
По сабжу и был QTableWidget.

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

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

Цитата: break
Удачи в чтении документации...
И всем того же !  ;D


Название: Re: QTableWidget + QComboBox
Отправлено: break от Февраль 06, 2011, 16:05
Цитировать
Только принцип - наследование в простых случаях (малая таблица)
ведет к разрастанию файлов проекта. Т.е. еще + 2 файла.

И что?


Название: Re: QTableWidget + QComboBox
Отправлено: shirushizo от Февраль 06, 2011, 22:56
Согласен. 10 строк кода, еще 2 файла в проекте - ничего страшного, просто бывает лень. И от Q*Widget стоит отказать в пользу MVC - пару дней изучения и потом полная свобода действий (хотя с drag'n'drop проблемы были). Так что дерзайте и не бойтесь трудностей  ;)


Название: Re: QTableWidget + QComboBox
Отправлено: spirits25 от Январь 19, 2012, 14:44
Для питона ни у кого нет случайно примера, как QComboBox вставить в QTableWidget?
Спасибо, нашёл сам. Или дошёл, не знаю=)


Название: Re: QTableWidget + QComboBox
Отправлено: Пытон от Январь 22, 2012, 18:11
Для питона ни у кого нет случайно примера, как QComboBox вставить в QTableWidget?
Спасибо, нашёл сам. Или дошёл, не знаю=)

А с другими питонерами вроде меня поделиться?  >:( :'(


Название: Re: QTableWidget + QComboBox
Отправлено: spirits25 от Январь 25, 2012, 10:41
всегда пожалуйста
Код:
                        pCombo = QtGui.QComboBox(self)
                        pCombo.setDuplicatesEnabled(False)
                        pCombo.setEditable(True)
                        pCombo.setLineEdit(QtGui.QLineEdit(self))
                        for i in comboValues:
                            pCombo.addItem(i)

                        self.mytable.setCellWidget(row, column, pCombo)
self.mytable тут - QTableWidget, в неё добавляем любой виджет (в данном случае комбобокс с возможностью редактировать).