C++ 在QabStretctTableModel上的setModel之后插入数据
我的模型是C++ 在QabStretctTableModel上的setModel之后插入数据,c++,qt,qabstracttablemodel,C++,Qt,Qabstracttablemodel,我的模型是QAbstractTableModel的一个子类,我已经重写了一些方法来实现这一点 class UserModel: public QAbstractTableModel { Q_OBJECT public: UserModel(QList<User> users, QObject *parent = Q_NULLPTR); int rowCount(const QModelIndex &) const override {
QAbstractTableModel
的一个子类,我已经重写了一些方法来实现这一点
class UserModel: public QAbstractTableModel
{
Q_OBJECT
public:
UserModel(QList<User> users, QObject *parent = Q_NULLPTR);
int rowCount(const QModelIndex &) const override
{
return users.size();
}
int columnCount(const QModelIndex &) const override
{
return 3;
}
QVariant data(const QModelIndex &index, int role) const override
{
if(role == Qt::DisplayRole)
{
User user = users.at(index.row());
QVariant data[] = { user.getFirstname(), user.getLastname() , user.getAge() };
return data[index.column()];
}
return {};
}
void sort(int column, Qt::SortOrder order) override
{
auto fnSort = [](const User & u1, const User & u2){ return u1.getFirstname() < u2.getFirstname(); };
auto lnSort = [](const User & u1, const User & u2){ return u1.getLastname() < u2.getLastname(); };
auto agSort = [](const User & u1, const User & u2){ return u1.getAge() < u2.getAge(); };
std::function<bool (const User &, const User &)> sortFn[] = {fnSort, lnSort, agSort};
std::sort(users.begin(), users.end(), sortFn[column]);
if(order == Qt::DescendingOrder)
{
std::reverse(users.begin(), users.end());
}
}
bool insertRows(int position, int rows, const QModelIndex &index) override
{
Q_UNUSED(index);
beginInsertRows(QModelIndex(), position, position + rows - 1);
for (int row = 0; row < rows; ++row)
users.insert(position, {User()});
endInsertRows();
return true;
}
bool setData(const QModelIndex &index, const QVariant &value, int role) override
{
if (index.isValid() && role == Qt::EditRole) {
int row = index.row();
User u = users.value(row);
if (index.column() == 0)
u.setFirstname(value.toString());
else if (index.column() == 1)
u.setLastname(value.toString());
else
return false;
users.replace(row, u);
emit(dataChanged(index, index));
return true;
}
return false;
}
Qt::ItemFlags flags(const QModelIndex &index) const override
{
return Qt::ItemIsEditable | QAbstractTableModel::flags(index);
}
QVariant headerData(int section, Qt::Orientation orientation, int role) const override
{
if (role == Qt::DisplayRole && orientation == Qt::Horizontal) {
switch (section) {
case 0:
return QString("firstname");
case 1:
return QString("lastname");
case 2:
return QString("age");
}
}
return QVariant();
}
signals:
void editCompleted(const QString &);
private:
QList<User> users;
};
#endif // USERMODEL_H
我尝试让我的模型与以下内容一起工作:
this->model->addSomethingToMyModel(newUser);
看起来更复杂。你能帮我一点忙吗?我的代码基于AddressBook示例您可以在模型类中添加如下函数:
void append(const User & user)
{
int row = _users.size();
insertRows(row, 1, QModelIndex());
_users[row] = user;
emit(dataChanged(index(row, 0), index(row, 2)));
}
然后向下转换表格模型以使用它:
UserModel * model = dynamic_cast<UserModel*>(myTableView->model());
model->append(newUser);
UserModel*model=dynamic_cast(myTableView->model());
模型->附加(新用户);
此处的前一个问题:
UserModel * model = dynamic_cast<UserModel*>(myTableView->model());
model->append(newUser);