QStandardItem 编辑后将 unsigned int 转换为 int

Posted

技术标签:

【中文标题】QStandardItem 编辑后将 unsigned int 转换为 int【英文标题】:QStandardItem converts unsigned int to int after editing 【发布时间】:2011-11-30 12:37:51 【问题描述】:

在编辑 QStandardItem 后,我创建了一个带有 QStandardItemModel 的 QTableview 类型从 unsigned int 更改为 int。 这种行为只发生在 unsigned int 上,并且在用户编辑它时,其他数据类型仍然存在。

window.cpp

#include "window.h"
#include "ui_window.h"
#include <QTableView>
#include <QStandardItem>
#include <QDebug>

Window::Window(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::Window)

    ui->setupUi(this);

    QTableView *tblview = new QTableView(this);
    model = new QStandardItemModel(0,0);

    tblview->setModel(model);

    QStandardItem *data=new QStandardItem;
    data->setEditable(true);
    data->setData(QVariant((uint)1), Qt::DisplayRole);
    model->setItem(0, 0, data);
    tblview->show();

    QModelIndex index = model->index( 0, 0, QModelIndex() );

    tblview->setGeometry(0,0,200,200);

    //result QVariant(uint, 1)
    qDebug() << model->data(index);



    connect(model, SIGNAL(itemChanged(QStandardItem*)), this, SLOT(dataChanged(QStandardItem*)));


Window::~Window()

    delete ui;


void Window::dataChanged(QStandardItem* stditem)

    //result
    //QVariant(int, 3)
    //expected result 
    //QVariant(uint, 3)
    qDebug() << model->data(stditem->index());


window.h

#ifndef WINDOW_H
#define WINDOW_H

#include <QMainWindow>
#include <QStandardItem>

namespace Ui 
    class Window;


class Window : public QMainWindow

    Q_OBJECT

public:
    explicit Window(QWidget *parent = 0);
    ~Window();

private:
    Ui::Window *ui;
    QStandardItemModel* model;

private slots:
    void dataChanged(QStandardItem*);
;

#endif // WINDOW_H

【问题讨论】:

【参考方案1】:

第二个qDebug() 不打印任何内容,因为您没有定义角色。这将起作用:

qDebug() << stditem->data(Qt::DisplayRole);

现在关于编辑后从 uint QVariantint 的转换。这是很自然的,可以解释如下:

首先你有一个QVariant,即uint

QVariant v = QVariant((uint) 5)); // It is uint now... 

编辑后,模型用输入的int值改变它的值

v = QVariant(10); // Now v is not uint anymore but int

为了避免这种情况,您应该继承QStandardItemModel,并重新实现setData 函数。在那里,您应该将新值显式转换为 uint

【讨论】:

这可能是一个错误。我做了一些测试,发现float变成了QString。也许你应该写一个错误报告。 bugreports.qt.nokia.com/secure/Dashboard.jspa

以上是关于QStandardItem 编辑后将 unsigned int 转换为 int的主要内容,如果未能解决你的问题,请参考以下文章

无法从 QtGui.QStandardItem 发出信号

QModelIndex 与 QStandardItem互转

QStyledItemDelegate 和 QStandardItem 防止更改文本,仅启用选择和复制

第58课 自定义模型类(上)

如何在 QStandardItem 图标上方显示文本?

委托中的 QStandardItem setBackground 使网格在 tableView 中消失