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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: [РЕШЕНО] QGraphicsView delegate плюс QComboBox  (Прочитано 2493 раз)
Yago13
Гость
« : Октябрь 15, 2012, 14:08 »

Господа подскажите, как победить глюк с открытием comboboxа из делегата в graphicsView. Пример во вложении. Qt 4.8.3.
« Последнее редактирование: Октябрь 17, 2012, 08:55 от Yago13 » Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #1 : Октябрь 16, 2012, 11:34 »

Вот workaround.

spinboxdelegate.h:
Код
C++ (Qt)
#ifndef SPINBOXDELEGATE_H
#define SPINBOXDELEGATE_H
 
#include <QItemDelegate>
 
class QComboBox;
 
class SpinBoxDelegate : public QItemDelegate
{
Q_OBJECT
public:
SpinBoxDelegate(QObject *parent = 0);
QWidget *createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const;
bool eventFilter( QObject* editor, QEvent* event );
 
private Q_SLOTS:
void resetEditor();
 
private:
mutable QComboBox* editor_;
};
 
#endif // SPINBOXDELEGATE_H
 

spinboxdelegate.cpp:
Код
C++ (Qt)
 
#include <QComboBox>
#include <QAbstractItemView>
#include <QEvent>
#include <QFocusEvent>
 
#include "spinboxdelegate.h"
 
SpinBoxDelegate::SpinBoxDelegate(QObject *parent)
: QItemDelegate(parent)
, editor_( 0 )
{
}
 
void SpinBoxDelegate::resetEditor()
{
editor_ = 0;
}
 
QWidget *SpinBoxDelegate::createEditor(QWidget *parent, const QStyleOptionViewItem &/* option */, const QModelIndex &/* index */) const
{
QComboBox* editor = new QComboBox(parent);
 
editor->addItem("aaa");
editor->addItem("bbb");
editor->addItem("ccc");
 
editor->view(); // we need this call to create popup
editor_ = editor;
connect( editor_, SIGNAL( destroyed() ), this, SLOT( resetEditor() ) );
 
return editor;
}
 
bool SpinBoxDelegate::eventFilter( QObject* o, QEvent* e )
{
if( e->type() == QEvent::FocusOut && o == editor_  &&
editor_->view()->isVisible() )
return true;
else
return QItemDelegate::eventFilter( o, e );
}
 

Но, имхо, держать интерактивную таблицу на сцене неправильно. Ещё неизвестно на какие проблемы напоришься.
Записан

Qt 5.11/4.8.7 (X11/Win)
Yago13
Гость
« Ответ #2 : Октябрь 17, 2012, 08:52 »

Огромное спасибо, это то что было нужно. QComboBox и QCalendarWidget работают. Так же помогал флаг Qt::Popup на QGraphicsProxyWidget, но widget соответственно закрывался при уничтожении фокуса. Есть вариант с высылкой сигнала из делегата лайнедиту который появляется над нужной ячейкой для ввода формулы по которой расчитывается значение в ячейке. Только делать комбобокс и календарь также не хотелось, ибо смысл делегата тогда был бы практически не понятен. И да, конечно QWidget и QGraphicsView две разные технологии скрещивать их не гигиенично, тем не менее плюсы, в моем случае, пока превышают минусы.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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