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

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

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: QStyledItemDelegate.  (Прочитано 14671 раз)
Bepec
Гость
« : Декабрь 05, 2011, 07:19 »

Мудрецы мира сего - Ответьте на один вопрос.

При отрисовке (именно отрисовки) в QTableView в ячейке кнопки, необходимо моделировать нажатие/отжатие/залипание.

Как нарисовать - проблемы нет.

Проблема: При выводе мышки за пределы ячейки, состояние кнопки застывает (т.е. нажать кнопку и вывести мышку за ячейку, кнопка останется нажатой).

Вопрос: Нужно как то уловить сигнал, когда мышка покидает ячейку с делегатом.

Заранее говорю - в делегат и в tableView сигнал hovered, leave  не поступает.
Записан
asvil
Гость
« Ответ #1 : Декабрь 05, 2011, 09:17 »

Писал такой делегат.
Реализовывал отжатие по однострельному таймеру.
Если вам надо в рамках работы скажите менеджеру, что такое невозможно.
Если хелоуворлд на локалхосте скажите самому себе, что это не нужно.
Записан
Bepec
Гость
« Ответ #2 : Декабрь 05, 2011, 09:37 »

Это хеллоуворд в рамках запланированных работ.
Если подскажете, как вывести хотя бы 1к строк с кнопками без лагов, буду благодарен (а таким макаром и 1,000,000 держит спокойно)

Ответ на вопрос решился - при нажатии генерируется сигнал MouseMove, запоминаем ячейку в которой мышка была нажата, и как только выход за пределы ячейки, восстанавливаем кнопку.

Вопрос иного толка - Состояние кнопки варьируется флагами.
Флаг QStyle::State_Enabled - нормальная кнопка.
Никак не могу найти флага на нажатую кнопку. Пробую методом перебора, если кто знает прошу черкануть Улыбающийся
Записан
andrew.k
Гость
« Ответ #3 : Декабрь 05, 2011, 09:58 »

Это хеллоуворд в рамках запланированных работ.

Я так и подозревал, что ты хеллоуворлдами занимаешься  Смеющийся
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #4 : Декабрь 05, 2011, 10:25 »

Никак не могу найти флага на нажатую кнопку. Пробую методом перебора, если кто знает прошу черкануть Улыбающийся
QStyle::State_Sunken
Записан

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

to GreatSnake:
Комбинации
Код:
button.state = QStyle::State_Sunken;
и
Код:
button.state = (QStyle::State_Sunken | QStyle::State_Enabled);

Дают просто эффект неактивной кнопки.

Если можно, небольшой набросок дадите?

to andrew.k:

Ненадо флудить во всех темах. Если нервы - то к врачу.
« Последнее редактирование: Декабрь 05, 2011, 12:09 от Bepec » Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



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

to GreatSnake:
Комбинации
Код:
button.state = QStyle::State_Sunken;
и
Код:
button.state = (QStyle::State_Sunken | QStyle::State_Enabled);

Дают просто эффект неактивной кнопки.
Странно.

Цитировать
Если можно, небольшой набросок дадите?
Наверное лучше будет показать тебе твой набросок)
Записан

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

Код:
	
void paint(QPainter *painter,
const QStyleOptionViewItem &option,
const QModelIndex &index) const
{
const packetModel * model_;
model_ = static_cast<const packetModel*>(index.model());
if (/*index.column() == 1 || */index.column() == 1)
{
// qDebug() << option.state;
QStyleOptionButton but;
but.rect = option.rect;
but.text = QString::number(777);
if (model_->dataCell(index.row(), index.column()) > 0)
but.state = QStyle::State_Enabled;
else
but.state = QStyle::State_Sunken ;
QApplication::style()->drawControl(QStyle::CE_PushButton,&but, painter);
}
else
QStyledItemDelegate::paint(painter, option, index);
};

Собственно все и упирается в эту функцию.

Вкратце - берет данные из модели если > 0, то обычная кнопка, иначе Sunken.
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



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

Попробуй так:
Код
C++ (Qt)
QStyleOptionButton but;
if( QWidget* w = dynamic_cast< QWidget* >( painter->device() ) )
but.initFrom( w );
but.rect = option.rect;
but.text = QString::number(777);
if (model_->dataCell(index.row(), index.column()) <= 0)
but.state |= QStyle::State_Sunken ;
QApplication::style()->drawControl(QStyle::CE_PushButton,&but, painter);
 
Записан

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

Появился странный эффект. Стандртный вид кнопки теперь "выделенная", аки под курсором мышки(причем работает к сожалению одновременно на все ячейки, что странно).

Нажимается прекрасно. Спасибо.

Можно немного объяснений что за |= ? Ниразу его не использовал, каюсь.

PS к сожалению ухожу на учебу, ответить смогу только завтра.
 
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #10 : Декабрь 05, 2011, 13:08 »

Появился странный эффект. Стандртный вид кнопки теперь "выделенная", аки под курсором мышки(причем работает к сожалению одновременно на все ячейки, что странно).
Хм, наверное с initFrom() я погорячился. Попробуй так:
Код
C++ (Qt)
QStyleOptionButton but;
but.rect = option.rect;
but.text = QString::number(777);
if( QWidget* w = dynamic_cast< QWidget* >( painter->device() ) )
{
if( w->isEnabled() )
but.state |= QStyle::State_Enabled;
if( w->window()->isActiveWindow() )
but.state |= QStyle::State_Active;
if( QRect( w->mapToGlobal( rect.topLeft() ), rect.size() ).contains( QCursor::pos() ) )
{
but.state |= QStyle::State_MouseOver;
if (model_->dataCell(index.row(), index.column()) <= 0)
{
but.state |= QStyle::State_Sunken;
}
if( wt->hasFocus() )
but.state |= QStyle::State_HasFocus;
}
} else
{
but.state |= QStyle::State_Enabled;
}
QApplication::style()->drawControl(QStyle::CE_PushButton,&but, painter);


Цитировать
Можно немного объяснений что за |= ? Ниразу его не использовал, каюсь.
Странно, ведь это:
Код
C++ (Qt)
but.state =  but.state | QStyle::State_Sunken;
Записан

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

К счастью или сожалению я пока еще начинающий специалист Улыбающийся
Многое надо еще узнать Улыбающийся
Rect - ты так видимо пытался получить объем исполняемой области? Таки оно не получится, там просто option эти данные содержит Улыбающийся

Немного подправленная рабочая версия кода:

Код:
		QStyleOptionButton but;
but.rect = option.rect;
but.text = QString::number(777);
if( QWidget* w = dynamic_cast< QWidget* >( painter->device() ) )
{
if( w->isEnabled() )
but.state |= QStyle::State_Enabled;
if( w->window()->isActiveWindow() )
but.state |= QStyle::State_Active;
if( QRect( w->mapToGlobal( but.rect.topLeft() ), but.rect.size() ).contains( QCursor::pos() ) )
{
but.state |= QStyle::State_MouseOver;
if (model_->dataCell(index.row(), index.column()) <= 0)
{
but.state |= QStyle::State_Sunken;
}
if( w->hasFocus() )
but.state |= QStyle::State_HasFocus;
}
} else
{
but.state |= QStyle::State_Enabled;
}
QApplication::style()->drawControl(QStyle::CE_PushButton,&but, painter);

Флаги Active/HasFocus/MouseOver для кнопки не подходят (в своей программе я их отключил).

Активе, Фокус - никакого эффекта.
МоусеОвер - эффект только после нажатия на клавишу.
« Последнее редактирование: Декабрь 06, 2011, 07:50 от Bepec » Записан
Bepec
Гость
« Ответ #12 : Декабрь 06, 2011, 08:06 »

Большое спасибо GreatSnake  - далее попытаюсь разобраться сам (подогнать пример под залипание, отлипание и прочая).

Тему пока не закрываю, мб появятся еще вопросы.
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



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

Только мне непонятно зачем тебе нужен такой изврат:
Цитировать
При отрисовке (именно отрисовки) в QTableView в ячейке кнопки, необходимо моделировать нажатие/отжатие/залипание.

почему просто в перегруженном QStyledItemDelegate::createEditor() не создать кнопку  Непонимающий
Записан

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

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

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

Аналогов окромя "автомата и к начальству", или рисование в делегате, я пока не вижу Улыбающийся
Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


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