QStandardItem konvertiert nicht signiertes int nach der Bearbeitung in INT
-
26-10-2019 - |
Frage
Ich erstelle eine QTableView mit einem QStandardItemmodel, nachdem ich den QStandardItem bearbeitet habe, der vom nicht signierten int zu int int geändert wurde. Dieses Verhalten ist einfach unsigniert und während der Benutzer es bearbeitet, bleiben andere Datentypen.
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());
}
Fenster.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
Lösung
Der Zweite qDebug()
druckt nichts, weil Sie die Rolle nicht definieren. Das wird funktionieren:
qDebug() << stditem->data(Qt::DisplayRole);
Jetzt über die Umwandlung von einem uint
QVariant
zu einem int
Nach der Bearbeitung. Dies ist natürlich und kann wie folgt erklärt werden:
Zuerst hast du eine QVariant
das ist uint
QVariant v = QVariant((uint) 5)); // It is uint now...
Nach der Bearbeitung ändert das Modell seinen Wert mit dem int -Wert, der eingegeben wird
v = QVariant(10); // Now v is not uint anymore but int
Um es zu vermeiden, sollten Sie die Unterklasse QStandardItemModel
, und neu einplanen setData
Funktion. Dort sollten Sie den neuen Wert ausdrücklich auf uint
.