Как выровнять lineEdit с маской в ячейке таблицы?

Использую QTableView. Сделал маску ввода для колонки, но ширина lineEdit изменилась.

Это заметно, когда она начинает быть в фокусе при редактировании.

Как это пофиксить?

Код маски:

QWidget *EditMaskDelegate::createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const
{
    auto * edit = QStyledItemDelegate::createEditor(parent,option,index);
    if(auto * lineEdit = dynamic_cast<QLineEdit*>(edit))
    {
        lineEdit->setInputMask("0000-00-00");
        lineEdit->setAlignment(Qt::AlignLeft | Qt::AlignVCenter);
    }
    return edit;
}

введите сюда описание изображения


Ответы (1 шт):

Автор решения: Alexander Chernin

Похоже у разрабов баг, или какая-то хитрая логика с ограничением на ширину поля ввода с маской.

Вот так работает:

class EditMaskDelegate: public QStyledItemDelegate
{
public:
    EditMaskDelegate(QObject * parent = nullptr): QStyledItemDelegate(parent) {}
    QWidget* createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const override
    {
        auto * edit = QStyledItemDelegate::createEditor(parent,option,index);
        if(auto * lineEdit = dynamic_cast<QLineEdit*>(edit))
        {
            lineEdit->setInputMask("0000-00-00");
            lineEdit->setAlignment(Qt::AlignLeft | Qt::AlignVCenter);

            // Иначе, при использовании маски, максимальная ширина 
            // поля ввода устанавливается в 100px
            lineEdit->setMaximumWidth(100000);
        }
        return edit;
    }

    void setEditorData(QWidget *editor, const QModelIndex &index) const override {
        QLineEdit* edit = qobject_cast<QLineEdit*>(editor);
        if (edit) {
            // Сохраняем текущую геометрию
            QRect rect = editor->geometry();

            // Устанавливаем текущее значение в поле ввода
            edit->setText(index.data(Qt::DisplayRole).toString());

            // Переустанавливаем ширину виджета после сброса в 
            // предыдущей строке до 100px
            edit->setMinimumWidth(rect.width());

            // Если добавить эту строку, то ширина поля ввода
            // полностью соответствует ширине ячейки таблицы 
            // во всех диапазонах
            edit->setMaximumWidth(rect.width());
        }
    }

    void updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option, const QModelIndex &index) const override {
        editor->setMinimumWidth(option.rect.width());
        editor->setMaximumWidth(option.rect.width());
        editor->setGeometry(option.rect);
    }
};
→ Ссылка