Предполагая, что у меня есть элемент QTableWidgetItem, и я просто хочу проверить данные, которые вводят пользователи. Например, пользователи только вводят число в этот элемент, в противном случае программа покажет диалоговое окно с предупреждением.
Я также ищу на эта страница документа но я не нашел подобную функцию с setValidator () функция.
Как я могу использовать валидатор для этого элемента QTableWidgetItem?
Спасибо!
Предполагая, что вы действительно хотите, это иметь 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()
). Это немного многословно, но выполнимо.
Я могу думать о двух разных способах справиться с этим. Могут быть и другие решения.
Вы можете создать подкласс QTableWidgetItem и переопределить setData
функция. Если вы укажете неверное значение, вы можете отправить сообщение об ошибке.
Вы можете создать подкласс QStyledItemDelegate и добавить QValidator в редактор. QWidget
путем переопределения createEditor
или переопределить setModelData
и изучить пользовательский ввод там. Еще раз, вы можете выдать сообщение об ошибке, если есть недействительные данные.
Проверьте документацию каждого из них, чтобы увидеть, что будет более подходящим для вашего проекта.
Я использую это решение, где у вас есть 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);
}