【问题标题】:QTableWidget: Only numbers via delegateQTableWidget:仅通过委托的数字
【发布时间】:2014-05-13 06:58:18
【问题描述】:

我目前正试图让我的 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)); ^

为什么?

【问题讨论】:

  • 如果你打电话给ui->tableWidget->setItemDelegate(new TableDelegate());怎么办?当您将委托设置为该表时,我认为您不需要将表设置为委托的父对象。
  • 不,这给了我一个非常相似的错误。
  • @vahancho:设置没有父母不是一个好主意。正如文档所说,QAbstractItemView 拥有委托的所有权,这意味着如果您不设置父级,则会发生内存泄漏。

标签: c++ qt delegates validation qtablewidget


【解决方案1】:

您可以通过继承 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);
}

注意:输入仅在用户按下回车时验证,而不是在他输入数据时验证。

【讨论】:

  • my_table_item 应该是什么?我在 QAbstractItemDelegate 中没有找到 setData 的文档,所以它必须有所不同。
  • 这是一个不同的解决方案,它根本不使用项目委托,而是使用 QTableWidgetItem 的子类。我编辑了我的答案,所以它清楚地说明了这一点。
  • 啊,好吧。但是,当我在 UI 中使用 TableWidget 时,将这个空白放在哪里?因为我的 QTableWidgetItems 没有自己的课程。
  • 如前所述,对于这种方法,您必须继承 QTableWidgetItem。我对 itemDelegate 没有经验,这是我通常所指的。继承 QTableWidgetItem 并覆盖单个方法非常简单。
  • 我在您编辑之前写了评论,所以我没有看到它,这很清楚,好吧。我将尝试实施并报告,感谢您迄今为止的帮助!
【解决方案2】:

我自己做的!我犯了几个错误:

  • 我忘记在我的头文件中继承 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);
}

感谢所有提供帮助的人。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-04
    相关资源
    最近更新 更多