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

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

Страниц: 1 [2]   Вниз
  Печать  
Автор Тема: QTableView и виджет в нем  (Прочитано 27712 раз)
DpoHro
Гость
« Ответ #15 : Май 16, 2009, 12:49 »

А если там должен быть комбобокс, его ж заморочишься рисовать. (( не понимаю я

Ничего подобного. См. QWidget::render(...)

Я сейчас посмотрел на примере делегата от QDateTimeEdit, сигнал itemChanged( QStandardItem * item ) приходит только при потере фокуса. Не понятно тогда как обработать нажатие кнопки ?

Если openPersistentEditor работает, почему тогда ты советуешь render? Какие то грабли есть?
Записан
DpoHro
Гость
« Ответ #16 : Май 16, 2009, 12:51 »

>>openPersistentEditor(index); - открывает делегата,
эта функция открывает не делегата, а виджет-редактор. Нужно всё по своим местам расставить, чтобы не было кашы у тебя в голове.
Да каша присутствует )) После MFC с QT приходится немного перестраиваться.
Записан
pastor
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 2901



Просмотр профиля WWW
« Ответ #17 : Май 16, 2009, 12:54 »

Если openPersistentEditor работает, почему тогда ты советуешь render? Какие то грабли есть?

Тему завели об отрисовке, ты сказал что самому отрисовывать сложные виджеты невозможно. Я тебя поправил, указав на render
Записан

Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
DpoHro
Гость
« Ответ #18 : Май 16, 2009, 12:58 »

Ясно, спасибо!, покапаюсь с openPersistentEditor пока, надеюсь научусь получать сообщения о клике по кнопке.
Записан
break
Гипер активный житель
*****
Offline Offline

Сообщений: 846


Просмотр профиля
« Ответ #19 : Май 17, 2009, 03:28 »

Столкнулся с аналогичной проблемой недавно - не совсем удобно что:

1) вроде можно написать любой делегат - то есть создающий в createEditor любой виджет редактирования, но он(виджет) создается при переходе в режим редактирования (именно тогда вызывается createEditor) и у бивается после завершения редактирования ячейки - соответственно не отрисовывается во время просмотра таблицы
2) Значит надо брать метод paint и переопределять его да еще и так чтобы своя отрисовка в точности повторяля стандартные Qt виджеты!!! Сначала страшно но - мне удалось для отрисовки чекбоксов и просто кнопочек(QPushButton) использовать такой код в paint:

Код:
void CBtn_Delegate::paint( QPainter * painter, const QStyleOptionViewItem &option,
  const QModelIndex &index ) const
{
QWidget * w = dynamic_cast<QWidget *>( painter->device() );
if ( w )
{
QStylePainter p( w );
QStyleOptionButton opt;
opt.icon = QIcon( m_sIconPath );
opt.iconSize = QSize( 24, 24 );
opt.initFrom( w );
opt.rect = option.rect;

if ( index.data().toInt() > 0 )
opt.state |= QStyle::State_On;
p.drawControl( QStyle::CE_PushButton, opt );
}

drawFocus( painter, option, option.rect );
}

---- рисует QPushButton для делегата кот. также создает QPushButton в createEditor (аналогично чекбоксы делал), тем не менее при клике по кнопке - не совсем хорошо работает - т.к. первый клик вызывает переход в режим редактирования, а уже последующие переключают кнопку. Хотя хотелось при первом клике переключить ее - а вот при нажатии клавиши "пробел" переход осуществляется сразу

триггеры редактирования заданы так:
Код:
m_enabledEditTriggers = QAbstractItemView::DoubleClicked |
QAbstractItemView::EditKeyPressed |
QAbstractItemView::AnyKeyPressed |
QAbstractItemView::SelectedClicked;

Зато если использовать QTableWidget - и в его ячейки впихивать виджеты по setCellWidget - то там и о отрисовке заботиться не надо и кликается сразу (жаль с QTableView так неп получается...)

Записан
Kolobok
Гость
« Ответ #20 : Май 17, 2009, 13:47 »

жаль с QTableView так неп получается...

Очень даже получается...

void QAbstractItemView::setIndexWidget ( const QModelIndex & index, QWidget * widget )
Записан
break
Гипер активный житель
*****
Offline Offline

Сообщений: 846


Просмотр профиля
« Ответ #21 : Май 17, 2009, 14:05 »

Спасибо за метод! не заметил его сам.

Но у меня эти кнопочки в огромной таблице рисуются - думаю там неправильно юзать вставку виджетов - просто жаль что нет более удобных триггеров редактирования для кликания мышкой - а то получается 2 клика вхолостую - только потом кнопка нажимается...
Записан
DpoHro
Гость
« Ответ #22 : Май 20, 2009, 13:14 »

openPersistentEditor кстати работает, кнопки в колонке все отображаются, вроде бы все хорошо, но я дошел до момента когда нужно уже обрабатывать клики по ним.

Что я сделал.
Так ли надо? Тут мне сдается есть более интересное решение как сигнал клика по делегату соединить со слотом моего виджета?

В делегате
Код:
class QPushButtonDelegate : public QItemDelegate
я добавил ф-ю в которую передаю виджет в котором хочу отловить клик по кнопкам.
Делаю коннект в креаторе
Код:
QWidget *QPushButtonDelegate::createEditor(QWidget *parent,
const QStyleOptionViewItem &/* option */,
const QModelIndex &/* index */) const
{

QPushButton *button = new QPushButton("X", parent);
connect(button, SIGNAL(clicked( )), m_mainwidget, SLOT(itemAdmitsTableRowDelete()));
return button;
}

Но вот беда. При первом клике смотрю уже по сигналу индекс строки в QTableView он равен -1, пока кликаю по той же кнопке все время -1, только кликнув по другой индексы начинают приходить правильные.

В чем дело? Может в креаторе запомнить QModelIndex и сделать новый сигнал у делегата и передавать в слот QModelIndex?
Записан
maks
Гость
« Ответ #23 : Май 22, 2009, 17:19 »

openPersistentEditor кстати работает, кнопки в колонке все отображаются, вроде бы все хорошо, но я дошел до момента когда нужно уже обрабатывать клики по ним.

Что я сделал.
Так ли надо? Тут мне сдается есть более интересное решение как сигнал клика по делегату соединить со слотом моего виджета?

В делегате
Код:
class QPushButtonDelegate : public QItemDelegate
я добавил ф-ю в которую передаю виджет в котором хочу отловить клик по кнопкам.
Делаю коннект в креаторе
Код:
QWidget *QPushButtonDelegate::createEditor(QWidget *parent,
const QStyleOptionViewItem &/* option */,
const QModelIndex &/* index */) const
{

QPushButton *button = new QPushButton("X", parent);
connect(button, SIGNAL(clicked( )), m_mainwidget, SLOT(itemAdmitsTableRowDelete()));
return button;
}

Но вот беда. При первом клике смотрю уже по сигналу индекс строки в QTableView он равен -1, пока кликаю по той же кнопке все время -1, только кликнув по другой индексы начинают приходить правильные.

В чем дело? Может в креаторе запомнить QModelIndex и сделать новый сигнал у делегата и передавать в слот QModelIndex?



А можно увидеть код класса QPushButtonDelegate.
Просто у меня похожая задача с таблицей.
Записан
DpoHro
Гость
« Ответ #24 : Май 22, 2009, 22:19 »

Вот оно
Только тут глюк есть, я пока не выяснял в чем дело, но сигналов приходит при клике слишком много ))
Записан
serg_hd
Хакер
*****
Offline Offline

Сообщений: 668



Просмотр профиля
« Ответ #25 : Январь 08, 2011, 17:38 »

жаль с QTableView так неп получается...

Очень даже получается...

void QAbstractItemView::setIndexWidget ( const QModelIndex & index, QWidget * widget )

Да уж, этот метод в разы облегчает дело! Тоже уже хотел было paint() перегружать.
Хотя у меня почему-то работает, но только если QModelIndex беру от модели, а не от представления:
Код
C++ (Qt)
this->tableview->setIndexWidget(model->index(1, 1), new QPushButton("ok", this->tableview)); /*работает, кнопка в нужной ячейке*/
 
this->tableview->setIndexWidget(this->tableview->indexAt(QPoint(1, 1)), new QPushButton("ok", this->tableview)); /*не работает, кнопка всегда в позиции 0:0, независимо от координат заданных в QPoint */
 

Видимо QTableView::indexAt() предназначен исключительно для перегрузки.

« Последнее редактирование: Январь 08, 2011, 17:51 от serg_hd » Записан

kubuntu/Win7/x64/NetBeans
Страниц: 1 [2]   Вверх
  Печать  
 
Перейти в:  


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