QTableWidget: только числа через делегата

В настоящее время я пытаюсь разрешить моему QTableWidget отображать только цифры. Я прочитал, что для этого мне нужен QAbstractItemDelegate, поэтому я прочитал документацию и обнаружил, что createEditor пуст. Вот мой код, который я сейчас использую:

#include "tabledelegate.h"

TableDelegate::TableDelegate(QObject *parent) : QStyledItemDelegate(parent)
{
}

QWidget* TableDelegate::createEditor(QWidget* parent,const QStyleOptionViewItem &option,const QModelIndex &index) const
{
    QLineEdit* editor = new QLineEdit(parent);
    QDoubleValidator* val = new QDoubleValidator(editor);
    val->setBottom(0);
    val->setNotation(QDoubleValidator::StandardNotation);
    editor->setValidator(val);
    return editor;
}

И я пытаюсь вызвать делегат, выполнив это в конструкторе MainWindow:

ui->tableWidget->setItemDelegate(new TableDelegate(ui->tableWidget));

Но это дает мне эту ошибку:

нет соответствующей функции для вызова 'QTableWidget::setItemDelegate(TableDelegate*)' ui->tableWidget->setItemDelegate(new TableDelegate(ui->tableWidget)); ^

Зачем?

2 ответа

Вместо использования делегата элемента вы можете добиться этого поведения, создав подкласс QTableWidgetItem и переопределив метод setData:

void my_table_item::setData(int role, const QVariant& value)
{
    if(role == Qt::EditRole)
    {
        QObject* parent = 0; // reference call needed for linux
        QRegExpValidator rxv(QRegExp("[+-]?\\d*\\.?\\d+"), parent);
        int pos = 0;
        QString tmp = value.toString(); // reference call needed by linux
        if(rxv.validate(tmp,pos) != QValidator::Acceptable) { return; }
    }
    this->QTableWidgetItem::setData(role, value);
}

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

Я сам это сделал! Несколько ошибок, которые я сделал:

  • Я забыл создать подкласс QStyledItemDelegate в моем заголовочном файле.
  • Я забыл переопределить другие три необходимые функции setEditorData(), setModelData() и updateEditorGeometry().
  • Я должен был запустить QMake.

Вот мой новый источник:

//HEADER
#ifndef TABLEDELEGATE_H
#define TABLEDELEGATE_H

#include <QStyledItemDelegate>

class TableDelegate : public QStyledItemDelegate
{
Q_OBJECT

public:
    TableDelegate(QObject* parent = 0);
    QWidget *createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const;
    void setEditorData(QWidget *editor, const QModelIndex &index) const;
    void setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const;
    void updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option, const QModelIndex &index) const;
};

#endif // TABLEDELEGATE_H

// CPP

#include "tabledelegate.h"
#include <QLineEdit>
#include <QDoubleValidator>
TableDelegate::TableDelegate(QObject *parent) : QStyledItemDelegate(parent)
{
}

QWidget* TableDelegate::createEditor(QWidget* parent,const QStyleOptionViewItem &option,const QModelIndex &index) const
{
    QLineEdit* editor = new QLineEdit(parent);
    QDoubleValidator* val = new QDoubleValidator(editor);
    val->setBottom(0);
    val->setNotation(QDoubleValidator::StandardNotation);
    editor->setValidator(val);
    return editor;
}

void TableDelegate::setEditorData(QWidget *editor, const QModelIndex &index) const
{
    double value = index.model()->data(index,Qt::EditRole).toDouble();
    QLineEdit* line = static_cast<QLineEdit*>(editor);
    line->setText(QString().setNum(value));
}

void TableDelegate::setModelData(QWidget* editor,QAbstractItemModel* model,const QModelIndex &index) const
{
    QLineEdit* line = static_cast<QLineEdit*>(editor);
    QString value = line->text();
    model->setData(index,value);
}

void TableDelegate::updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option, const QModelIndex &index) const
{
    editor->setGeometry(option.rect);
}

Спасибо всем, кто помог, хотя.

Другие вопросы по тегам