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

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

Страниц: 1 [2]   Вниз
  Печать  
Автор Тема: QStyledItemDelegate.  (Прочитано 14653 раз)
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #15 : Декабрь 06, 2011, 11:00 »

Скажем так условие начальства - список у каждого элемента списка кнопка управления (3 состояния).

В планах, что список может быть от 1 до 10к элементов :-D Требования к железу - чтобы на 500 мгц шла и не тормозила Улыбающийся

Аналогов окромя "автомата и к начальству", или рисование в делегате, я пока не вижу Улыбающийся
Всё это понятно.
Непонятно зачем нужно имитировать поведение кнопки, когда для этого можно использовать саму кнопку. Ведь кнопка будет всего лишь одна для активной ячейки.
Записан

Qt 5.11/4.8.7 (X11/Win)
asvil
Гость
« Ответ #16 : Декабрь 06, 2011, 19:24 »

А можно вообще сделать popup меню для view-a.
А если это столбец данных или состояние, то это checkbox tristate, но никак не кнопка. А ви вообще как себе представляете 3 состояния у кнопки?
Записан
Bepec
Гость
« Ответ #17 : Декабрь 07, 2011, 07:05 »

to GreatSnake;
Скажем так - условие - чтобы кнопка была на КАЖДОЙ строке. Видимая явно.

Филоненко Михаил, давайте вместе подумаем.
Кнопка бывает - Активной, Неактивной, Зажатой? Таки дык?
Вот и 3 набралось. Вам хватит для дальнейших рассуждений?

PS Я все же начинающий, делая работу одновременно учу Qt/возможности, дабы потом представлять что реально, а что нет Улыбающийся
К тому ж тролли описывали этот метод как наиболее быстрый в обработке.
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #18 : Декабрь 07, 2011, 07:26 »

to GreatSnake;
Скажем так - условие - чтобы кнопка была на КАЖДОЙ строке. Видимая явно.
Мде, уж больно усложнил всё.
Во-первых забудь про "3 состояния".  Qt всё сама за тебя сделает)
Всё делается намного проще:
  • Выстави QTableView::setEditTriggers( QAbstractItemView::CurrentChanged )
  • В перегруженном QStyledItemDelegate::createEditor() создавай кнопку
  • В перегруженном QStyledItemDelegate::paint() отрисовывай неактивную кнопку
Записан

Qt 5.11/4.8.7 (X11/Win)
Bepec
Гость
« Ответ #19 : Декабрь 07, 2011, 07:33 »

GreatSnake вопрос - А не нужно ли будет в данном случае на каждую кнопку тыркать дважды? Улыбающийся
Для доступного нажатия?

Этот вариант пробовал, но 2 нажатия вместо одного, это плохо. Особенно если учесть, что управление кликами идти будет Улыбающийся

update: нужно еще к сожалению отрисовывать и активную/зажатую клавишу.
« Последнее редактирование: Декабрь 07, 2011, 08:21 от Bepec » Записан
asvil
Гость
« Ответ #20 : Декабрь 07, 2011, 09:02 »

checkable action в меню может быть checked, unchecked, disabled.
Записан
Bepec
Гость
« Ответ #21 : Декабрь 07, 2011, 09:26 »

Михаил, спасибо за повтор информации, я это понял уже давно, о чем и изливал свою грусть в предыдущих постах )
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #22 : Декабрь 07, 2011, 12:48 »

GreatSnake вопрос - А не нужно ли будет в данном случае на каждую кнопку тыркать дважды? Улыбающийся
Для доступного нажатия?

Этот вариант пробовал, но 2 нажатия вместо одного, это плохо. Особенно если учесть, что управление кликами идти будет Улыбающийся

update: нужно еще к сожалению отрисовывать и активную/зажатую клавишу.
Видать плохо пробовал.
Вот рабочий пример:
Код
C++ (Qt)
#include <QApplication>
#include <QKeyEvent>
#include <QPainter>
#include <QPushButton>
#include <QStandardItemModel>
#include <QStyledItemDelegate>
#include <QTableView>
 
class ButtonItemDelegate : public QStyledItemDelegate
{
Q_OBJECT
public:
ButtonItemDelegate( QObject* p = 0 )
: QStyledItemDelegate( p ) {}
 
protected:
void paint(
QPainter* painter,
const QStyleOptionViewItem& option,
const QModelIndex& index ) const
{
QStyleOptionButton opt;
opt.rect = option.rect;
opt.text = index.data().toString();
if( QWidget* w = dynamic_cast< QWidget* >( painter->device() ) )
{
if( w->isEnabled() )
opt.state |= QStyle::State_Enabled;
if( w->window()->isActiveWindow() )
opt.state |= QStyle::State_Active;
} else
{
opt.state |= QStyle::State_Enabled;
}
QApplication::style()->drawControl( QStyle::CE_PushButton, &opt, painter );
}
QWidget* createEditor( QWidget* parent, const QStyleOptionViewItem& option, const QModelIndex& index ) const
{
QPushButton* pb = new QPushButton( index.data().toString(), parent );
pb->setAutoDefault( true );
connect( pb, SIGNAL( clicked() ), this, SLOT( buttonPressed() ) );
return pb;
}
void setModelData( QWidget* editor, QAbstractItemModel* model, const QModelIndex& index ) const
{
}
bool eventFilter( QObject* o, QEvent* e )
{
if( e->type() == QEvent::KeyPress )
{
switch( static_cast< QKeyEvent* >( e )->key() )
{
case Qt::Key_Enter:
case Qt::Key_Return:
case Qt::Key_Escape:
return false;
default:
break;
}
}
else if( e->type() == QEvent::FocusOut )
return false;
return QStyledItemDelegate::eventFilter( o, e );
}
protected Q_SLOTS:
void buttonPressed()
{
qDebug( "Button pressed..." );
}
};
 
int main( int argc, char** argv )
{
QApplication app( argc, argv );
 
QTableView tv;
QStandardItemModel m;
 
tv.setModel( &m );
tv.setItemDelegate( new ButtonItemDelegate( &tv ) );
tv.setEditTriggers(
QAbstractItemView::CurrentChanged |
QAbstractItemView::SelectedClicked );
 
int rc = 20;
 
m.setColumnCount( rc );
m.setRowCount( rc );
 
for( int r = 0; r < rc; r++ )
for( int c = 0; c < rc; c++ )
{
QModelIndex mi = m.index( r, c );
m.setData( mi, QString( "%1:%2" ).
arg( r + 1, 2, 10, QChar( '0' ) ).
arg( c + 1, 2, 10, QChar( '0' ) ), Qt::DisplayRole );
}
 
tv.show();
return app.exec();
}
 
"тыркать дважды" не нужно)
Записан

Qt 5.11/4.8.7 (X11/Win)
Bepec
Гость
« Ответ #23 : Декабрь 07, 2011, 14:24 »

К сожалению завалили бумажные дела, позже посмотрю, где же и что же я упустил.
Записан
BRE
Гость
« Ответ #24 : Декабрь 07, 2011, 14:32 »

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

Если нужна возможность кликать на кнопке не активного элемента, то остается рисовать и обрабатывать все самому (paint + editorEvent).
Записан
Страниц: 1 [2]   Вверх
  Печать  
 
Перейти в:  


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