2013-08-19 7 views
3

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

Я также ищу на that document page, но я не нашел схожую функцию с setValidator() функция.

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

Спасибо!

ответ

1

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

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

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

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

QTableWidgetItem

QStyledItemDelegate

4

Предполагая, что вы действительно хотите, чтобы иметь QValidate -able клетки, вы можете заполнить клетки с 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()). Это немного подробный, но работоспособный.

+0

Приятный обходной путь! Хотя первая ячейка (0, 0) в линейной строке немного ошибочна. Каждая другая камера выглядит великолепно, но самая первая кажется слишком высокой, слишком левой, слишком широкой и слишком высокой. – Uroc327

0

Я использую это решение, где у вас есть 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); 
    } 

 Смежные вопросы

  • Нет связанных вопросов^_^