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 *);