ich habe eine kurze Frage und ich hoffe jemand könnte mir dabei helfen.
Ich habe ein selbst definierte Model, dass ich mit eine QTableView verbunden habe. Mein Model enthält eine QMap<QString, QString>. In der Map befinden sich Variablen und Ihren Werte das ich per Ethernet bekomme. Das Problem ist die Werten ändern sich ständig und ich möchte der Benutzer die Möglichkeit anbieten, ein Variablewert zu ändern. dafür habe ich die funktion setData() implementiert. Außerdem habe ich eine Funktion setDataMap(), die mir ermöglicht den Map zu aktualisieren solange ich neue Datenbekommen habe. Damit wird die ganze View aktualisiert.
Code: Alles auswählen
void TableModel::setDataMap(const QMap<QString, QString> &map)
{
beginResetModel();
m_Data = map;
endResetModel();
}Code: Alles auswählen
TableModel::TableModel(MainWindow *win, QObject *parent): QAbstractTableModel(parent)
{
m_Win = win;
for(int i = 0; i < 200; i++)
checked[i] = false;
}
int TableModel::rowCount(const QModelIndex &parent) const
{
Q_UNUSED(parent);
return m_Data.size();
}
int TableModel::columnCount(const QModelIndex &parent) const
{
Q_UNUSED(parent);
return 2;
}
QVariant TableModel::data(const QModelIndex &index, int role) const
{
if (!index.isValid())
return QVariant();
if (index.row() >= m_Data.size() || index.row() < 0)
return QVariant();
if (role == Qt::DisplayRole)
{
if (index.column() == 0)
return dataAt(index.row());
else if (index.column() == 1)
if (checked[index.row()])
{
return QVariant();
}
else
return m_Data.value(dataAt(index.row()));
}
if(role==Qt::CheckStateRole )
if(index.column() == 1 )
{
if (checked[index.row()])
return Qt::Checked;
else
return Qt::Unchecked;
}
return QVariant();
}
QVariant TableModel::headerData(int section, Qt::Orientation orientation, int role) const
{
if (role != Qt::DisplayRole)
return QVariant();
if (orientation == Qt::Horizontal) {
switch (section) {
case 0:
return QString("Variable");
case 1:
return QString("Value");
default:
return QVariant();
}
}
return QVariant();
}
void TableModel::setDataMap(const QMap<QString, QString> &map)
{
beginResetModel();
m_Data = map;
endResetModel();
}
QString TableModel::dataAt(int offset) const
{
return (m_Data.begin() + offset).key();
}
Qt::ItemFlags TableModel::flags(const QModelIndex &index) const
{
Qt::ItemFlags flags = QAbstractItemModel::flags(index);
flags |= Qt::ItemIsEditable;
if (!index.isValid())
return Qt::ItemIsEnabled;
if (index.column() == 1)
flags |= Qt::ItemIsUserCheckable | Qt::ItemIsSelectable | Qt::ItemIsEnabled;
return flags;
}
bool TableModel::setData(const QModelIndex &index, const QVariant &value, int role)
{
if (role == Qt::CheckStateRole)
{
QString data = dataAt(index.row());
if(!checked[index.row()])
{
checked[index.row()] = true;
m_Win->sendCmd("stoplog " + data + "\r\n");
}
else
{
checked[index.row()] = false;
m_Win->sendCmd("startlog " + data + "\r\n");
}
return true;
}
if (role == Qt::EditRole)
{
QString data = dataAt(index.row());
QString val = value.toString();
if(checked[index.row()])
m_Win->sendCmd("setvalue " + data + " " + val +"\r\n");
return true;
}
return false;
}