Как использовать валидатор с QTableWidgetItem?

Предполагая, что у меня есть элемент QTableWidgetItem, и я просто хочу проверить данные, которые вводят пользователи. Например, пользователи только вводят число в этот элемент, в противном случае программа покажет диалоговое окно с предупреждением.

Я также ищу на эта страница документа но я не нашел подобную функцию с setValidator () функция.

Как я могу использовать валидатор для этого элемента QTableWidgetItem?

Спасибо!

3

Решение

Предполагая, что вы действительно хотите, это иметь QValidateклетки, вы можете заполнить клетку QLineEdit экземпляр вместо. Вот пример, который использует QDoubleValidator, но любой QValidator буду работать:

QLineEdit *edit = new QLineEdit(ui->myTable);
edit->setValidator(new QDoubleValidator(edit));
ui->myTable->setCellWidget(row, col, edit);

По умолчанию, QLineEdit заполнит ячейку и будет нарисован с рамкой. Чтобы сохранить внешний вид таблицы, вы можете отключить фрейм, предварительно вызвав следующую функцию:

QLineEdit::setFrame(false);

Одна из неприятных особенностей этого решения заключается в том, что вам придется

QWidget* QTableWidget::cellWidget(row, col) const

чтобы впоследствии получить доступ к экземпляру QLineEdit в каждой ячейке, что означает, что вам придется привести указатель к QLineEdit* также. (Увидеть qobject_cast()). Это немного многословно, но выполнимо.

4

Другие решения

Я могу думать о двух разных способах справиться с этим. Могут быть и другие решения.

Вы можете создать подкласс QTableWidgetItem и переопределить setData функция. Если вы укажете неверное значение, вы можете отправить сообщение об ошибке.

Вы можете создать подкласс QStyledItemDelegate и добавить QValidator в редактор. QWidget путем переопределения createEditor или переопределить setModelData и изучить пользовательский ввод там. Еще раз, вы можете выдать сообщение об ошибке, если есть недействительные данные.

Проверьте документацию каждого из них, чтобы увидеть, что будет более подходящим для вашего проекта.

QTableWidgetItem

QStyledItemDelegate

2

Я использую это решение, где у вас есть QLineEdit в каждой ячейке. валидатор предназначен для научных номеров (например, 2e-17)

for(int trow=0; trow <= 2; trow++ )
{
for(int tcolumn=0; tcolumn <= 3; tcolumn++ )
{
QLineEdit * tableline = new QLineEdit;
tableline->setValidator( new QDoubleValidator(0, 100, 2, this) );
ui->tableWidget->setCellWidget ( trow, tcolumn,  tableline);
}
0
По вопросам рекламы [email protected]