Название: [РЕШЕНО] QGraphicsView delegate плюс QComboBox
Отправлено: Yago13 от Октябрь 15, 2012, 14:08
Господа подскажите, как победить глюк с открытием comboboxа из делегата в graphicsView. Пример во вложении. Qt 4.8.3.
Название: Re: QGraphicsView delegate плюс QComboBox
Отправлено: GreatSnake от Октябрь 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 ); }
Но, имхо, держать интерактивную таблицу на сцене неправильно. Ещё неизвестно на какие проблемы напоришься.
Название: Re: QGraphicsView delegate плюс QComboBox
Отправлено: Yago13 от Октябрь 17, 2012, 08:52
Огромное спасибо, это то что было нужно. QComboBox и QCalendarWidget работают. Так же помогал флаг Qt::Popup на QGraphicsProxyWidget, но widget соответственно закрывался при уничтожении фокуса. Есть вариант с высылкой сигнала из делегата лайнедиту который появляется над нужной ячейкой для ввода формулы по которой расчитывается значение в ячейке. Только делать комбобокс и календарь также не хотелось, ибо смысл делегата тогда был бы практически не понятен. И да, конечно QWidget и QGraphicsView две разные технологии скрещивать их не гигиенично, тем не менее плюсы, в моем случае, пока превышают минусы.
|