漳州微网站建设公司推荐网站没有icp备案怎么访问

当前位置: 首页 > news >正文

}时钟的滴答声缺少了一些东西需要每一秒都告诉视图时间已经改变、需要再次读取。我们用定时器来做这个在构造函数中我们将其间隔设置为1秒并连接其超时信号。(文件来源examples/widgets/tutorials/modelview/3_changingmodel/mymodel.cpp)MyModel::MyModel(QObject *parent)
QAbstractTableModel(parent) , timer(new QTimer(this)) { timer-setInterval(1000); connect(timer, QTimer::timeout , this, MyModel::timerHit); timer-start(); }这里是对应的槽位(文件来源examples/widgets/tutorials/modelview/3_changingmodel/mymodel.cpp)void MyModel::timerHit() { // we identify the top left cell QModelIndex topLeft createIndex(0,0); // emit a signal to make the view reread identified data emit dataChanged(topLeft, topLeft, {Qt::DisplayRole}); } 通过发出dataChanged() 信号我们要求视图再次读取左上角单元格中的数据。注意没有显式地将dataChanged()信号连接到视图这在调用setModel()时自动发生。2.4 设置列和行标题标题可以通过一个视图方法隐藏ableView-verticalHeader()-hide()然而头部内容是通过模型设置的所以我们重新实现headerData()方法(文件来源examples/widgets/tutorials/modelview/4_headers/mymodel.cpp)QVariant MyModel::headerData(int section, Qt::Orientation orientation, int role) const { if (role Qt::DisplayRole orientation Qt::Horizontal) { switch (section) { case 0: return QString(first); case 1: return QString(second); case 2: return QString(third); } } return QVariant(); }注意方法headerData()也有一个参数role其含义与MyModel::data()中的相同。2.5 最小编辑示例在本例中我们将构建一个应用程序通过重复输入到表格单元格中的值自动用内容填充窗口标题。为了能够方便地访问窗口标题我们将QTableView放在QMainWindow中。模型决定编辑功能是否可用为了启用可用的编辑功能我们只需要修改模型这是通过重新实现以下虚拟方法来实现的:setData() 和flags()。(文件来源examples/widgets/tutorials/modelview/5_edit/mymodel.h)// mymodel.h #include QAbstractTableModel #include QStringconst int COLS 3; const int ROWS 2;class MyModel : public QAbstractTableModel { Q_OBJECT public: MyModel(QObject *parent nullptr); int rowCount(const QModelIndex parent QModelIndex()) const override; int columnCount(const QModelIndex parent QModelIndex()) const override; QVariant data(const QModelIndex index, int role Qt::DisplayRole) const override; bool setData(const QModelIndex index, const QVariant value, int role Qt::EditRole) override; Qt::ItemFlags flags(const QModelIndex index) const override; private: QString m_gridData[ROWS][COLS]; //holds text entered into QTableView signals: void editCompleted(const QString ); };我们使用二维数组QString m_gridData来存储数据这使得m_gridData成为MyModel的核心。MyModel的其余部分就像一个包装器并将m_gridData适配到QAbstractItemModel接口同时我们引入了editCompleted()信号这使得将修改后的文本传输到窗口标题成为可能。(文件来源examples/widgets/tutorials/modelview/5_edit/mymodel.cpp)bool MyModel::setData(const QModelIndex index, const QVariant value, int role) { if (role Qt::EditRole) { if (!checkIndex(index)) return false; //save value from editor to member m_gridData m_gridData[index.row()][index.column()] value.toString(); //for presentation purposes only: build and emit a joined string QString result; for (int row 0; row ROWS; row) { for (int col 0; col COLS; col) result m_gridData[row][col] ; } emit editCompleted(result); return true; } return false; }每次用户编辑单元格时都会调用setData()index参数告诉我们编辑了哪个字段value提供了编辑过程的结果。角色总是被设置为Qt::EditRole 因为我们的单元格只包含文本如果存在一个复选框并且用户权限设置为允许选择该复选框则调用也会将角色设置为Qt::CheckStateRole。(文件来源examples/widgets/tutorials/modelview/5_edit/mymodel.cpp)Qt::ItemFlags MyModel::flags(const QModelIndex index) const { return Qt::ItemIsEditable | QAbstractTableModel::flags(index); }可以使用flags()调整单元格的各种属性。返回Qt::ItemIsSelectable | Qt::ItemIsEditable | Qt::ItemIsEnabled足以向编辑器显示一个单元格可以被选择。如果编辑一个单元格修改的数据多于该特定单元格中的数据则模型必须发出dataChanged()信号以便读取已更改的数据。