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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: небольшой вопрос по связке QTableView + QComboBox + QItemDelegate  (Прочитано 3373 раз)
yonas
Гость
« : Январь 30, 2011, 23:52 »

У меня есть QTableView. Некоторым столбцам ячеек делегировал комбобоксы.
Всё хорошо, всё работает, но хочу изменить следующую последовательность:

1. когда кликаешь по ячейке - появляется комбобокс _не раскрытый_
2. кликаешь по комбобоксу - раскрываешь его (значение стоит по-умолчанию некое).
3. кликаешь по желаемому значению - комбобокс сворачивается
4. жмёшь ENter или кликаешь мышкой в отличную от комбобокса область - значение в комбобоксе присваивается ячейке.

мне было хотелось сделать так:
1. чтобы можно на 3-ем шаге кликать по комбобоксу и 4-ый шаг пробегал автоматом (главное)
2. чтобы на 1-ом шаге появлялся раскрытый комбобокс.

подскажите, пожалуйста, как это сделать? (хотя бы общие черты)
« Последнее редактирование: Январь 31, 2011, 00:29 от yonas » Записан
kirill
Гость
« Ответ #1 : Февраль 02, 2011, 17:30 »

1. чтобы можно на 3-ем шаге кликать по комбобоксу и 4-ый шаг пробегал автоматом (главное)

Это элементарно.
Код
C++ (Qt)
QWidget * MyTableDelegate::createEditor(QWidget * parent,
                                       const QStyleOptionViewItem & ,
                                       const QModelIndex & idx) const
{
     QComboBox * box = new QComboBox(parent);
     connect(box, SIGNAL(currentIndexChanged(int)), this, SLOT(closeCombo()));
     return box;
}
 
void MyTableDelegate::closeCombo()
{
  QComboBox * bx = qobject_cast<QComboBox *>(sender());
  if (bx)
  {
     emit commitData(bx); //фиксировать данные
     emit closeEditor(bx); // здесь вторым параметром можно задать поведение - перейти на след или пред ячейку либо же ничего не делать, просто закрыть редактор
  }
}
 
 

С тем чтобы комбобокс сразу раскрывался пришлось немного заморочиться.
Пришлось ставить коннект самому себе причем с постановкой обработки в очередь.
Короче код такой:

Код
C++ (Qt)
MyTableDelegate::MyTableDelegate(QObject *parent)
: QItemDelegate(parent)
{
  connect(this, SIGNAL(showComboPopup(QComboBox *)),
     this, SLOT(openComboPopup(QComboBox *)),
     Qt::QueuedConnection); // именно Qt::QueuedConnection - это важно!
}
 
void MyTableDelegate::openComboPopup(QComboBox * bx)
{
  bx->showPopup();
}
 
QWidget * MyTableDelegate::createEditor(QWidget * parent,
                                       const QStyleOptionViewItem & ,
                                       const QModelIndex & idx) const
{
     QComboBox * box = new QComboBox(parent);
     connect(box, SIGNAL(currentIndexChanged(int)), this, SLOT(closeCombo()));
     emit showComboPopup(box);
     return box;
}
 
//В классе объявления
signals:
  void showComboPopup(QComboBox *) const;
protected slots:
  void closeCombo();
  void openComboPopup(QComboBox *);
 
 
Записан
yonas
Гость
« Ответ #2 : Февраль 04, 2011, 00:27 »

спасибо большое Улыбающийся
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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