Russian Qt Forum

Qt => Общие вопросы => Тема начата: BuRn от Март 26, 2012, 19:43



Название: Редактирование, фокус, QTableView, Отменить окочание редактирования ячейки
Отправлено: BuRn от Март 26, 2012, 19:43
Здравствуйте!
Имеется следующий вопрос. Есть свой виджет, наследованный от QLineEdit. Виджет представляет из себя собственно QLineEdit над которым появляется калькулятор при получении фокуса ввода. При нажатии на кнопки калькулятора, цифры вводятся в QLineEdit. Калькулятор унаследован от QDialog. Калькулятор немодальный, но всегда находится поверх QMainWindow.
Код:
class CafeLineEdit : public QLineEdit {
    Q_OBJECT
public:
    CafeLineEdit(QWidget *parent = 0);
    void refreshCalcPos();
    ~CafeLineEdit();
protected:
    void mousePressEvent(QMouseEvent *);
    void resizeEvent(QResizeEvent *) { refreshCalcPos(); }
private slots:
    void calculatorClicked();
private:
    Ui::CalculatorWidget *calculator;
    QDialog *calculatorDialog;
    QValidator *validator;
};
Далее. Есть QTableView в котором данный виджет является виджетом редактирования(отдается делегатом). Но отредактировать значение в таблице с использованием данного виджета не получается из-за того, что при создании виджета, калькулятор автоматически получает фокус
Код:
void CafeLineEdit::mousePressEvent(QMouseEvent *) {
    refreshCalcPos();
    calculatorDialog->show();
}
, а при потере фокуса ввода QTableView считает, что редактирование закончено и закрывает виджет редактирования. Получается, что калькулятор создается и тут же закрывается. Можно ли как-то решить эту проблему? Можно ли унаследоваться от QTableView и запретить прерывать редактирование при потере фокуса ввода? Либо, возможно, есть более элегантное решение?


Название: Re: Редактирование, фокус, QTableView, Отменить окочание редактирования ячейки
Отправлено: BuRn от Март 26, 2012, 20:33
Решение: необходимо унаследоваться от QTableView и перегрузить метод.

Код:
void QAbstractItemView::closeEditor ( QWidget * editor, QAbstractItemDelegate::EndEditHint hint ) [virtual protected slot]

После чего QDialog перестанет пропадать, а при нажатии кнопки Закрыть в диалоге можно закрывать редактирование.