qt5的mvc模型视图代理实现,其中model有9列数据,最多20行数据,根据数据内容QVector<YX_INFO*>类的总数来分页。 列数据依次为:点号,信息描述,遥信位,动作时间,复归时间,验收时间,确认状态,确认/取消,通道类型, 其中1,2,3,8,9列数据初始化有数据,其他列数据为空。第8列数据是ico图标。 初始化的时候只加载一页数据。 当有新的数据来的时候,清除当前页的数据和内存,比较该数据属于哪一页加载改页,并选中数据行,颜色置高亮,更新选中行的其他数据,其中第8列数据更改图标,请思考一下,给出代码c++用例
时间: 2024-03-21 11:42:37 浏览: 107
Qt5实现的一个mvc 的例子
下面是一个简单的示例代码,实现了Qt5的MVC模式视图代理,并根据数据内容进行了分页和数据更新操作。其中,YX_INFO类代表一个数据项,QVector<YX_INFO*>类代表所有数据项的容器。该代码使用QStandardItemModel作为模型,并为模型添加了9列数据。其中,第一列是点号,第二列是信息描述,第三列是遥信位,第四列是动作时间,第五列是复归时间,第六列是验收时间,第七列是确认状态,第八列是确认/取消,第九列是通道类型。第八列使用QStandardItem来显示一个图标。
```
#include <QStandardItemModel>
#include <QStandardItem>
#include <QVector>
struct YX_INFO
{
QString point_no;
QString info_desc;
QString yx_bit;
QString action_time;
QString reset_time;
QString verify_time;
QString confirm_status;
bool confirm;
QString channel_type;
};
class YxModel : public QStandardItemModel
{
public:
YxModel(QObject *parent = nullptr);
void setData(const QVector<YX_INFO*>& data);
void clearData();
void updateData(YX_INFO* data);
private:
void refreshView(int page);
private:
QVector<QVector<YX_INFO*>> m_dataPages;
int m_currentPage;
int m_totalPages;
int m_pageSize;
QHash<QString, QStandardItem*> m_itemHash;
};
YxModel::YxModel(QObject *parent)
: QStandardItemModel(parent), m_currentPage(0), m_totalPages(0), m_pageSize(20)
{
setColumnCount(9);
setHeaderData(0, Qt::Horizontal, tr("点号"));
setHeaderData(1, Qt::Horizontal, tr("信息描述"));
setHeaderData(2, Qt::Horizontal, tr("遥信位"));
setHeaderData(3, Qt::Horizontal, tr("动作时间"));
setHeaderData(4, Qt::Horizontal, tr("复归时间"));
setHeaderData(5, Qt::Horizontal, tr("验收时间"));
setHeaderData(6, Qt::Horizontal, tr("确认状态"));
setHeaderData(7, Qt::Horizontal, tr("确认/取消"));
setHeaderData(8, Qt::Horizontal, tr("通道类型"));
}
void YxModel::setData(const QVector<YX_INFO*>& data)
{
clearData();
m_totalPages = (data.size() + m_pageSize - 1) / m_pageSize;
for (int i = 0; i < m_totalPages; ++i) {
QVector<YX_INFO*> pageData;
for (int j = 0; j < m_pageSize && i * m_pageSize + j < data.size(); ++j) {
pageData.append(data[i * m_pageSize + j]);
}
m_dataPages.append(pageData);
}
refreshView(m_currentPage);
}
void YxModel::clearData()
{
m_dataPages.clear();
m_currentPage = 0;
m_totalPages = 0;
m_itemHash.clear();
clear();
}
void YxModel::updateData(YX_INFO* data)
{
for (int i = 0; i < m_dataPages.size(); ++i) {
QVector<YX_INFO*>& pageData = m_dataPages[i];
for (int j = 0; j < pageData.size(); ++j) {
YX_INFO* itemData = pageData[j];
if (itemData == data) {
// 更新数据
QStandardItem* item = m_itemHash.value(data->point_no);
if (item) {
item->setData(QPixmap(data->confirm ? ":/confirm.png" : ":/cancel.png"), Qt::DecorationRole);
item->setData(data->confirm ? tr("已确认") : tr("已取消"), Qt::DisplayRole);
// 更新其他数据
item->setData(data->info_desc, Qt::UserRole + 1);
item->setData(data->yx_bit, Qt::UserRole + 2);
item->setData(data->action_time, Qt::UserRole + 3);
item->setData(data->reset_time, Qt::UserRole + 4);
item->setData(data->verify_time, Qt::UserRole + 5);
item->setData(data->channel_type, Qt::UserRole + 6);
return;
}
}
}
}
}
void YxModel::refreshView(int page)
{
clear();
m_itemHash.clear();
if (page < 0 || page >= m_dataPages.size())
return;
QVector<YX_INFO*>& pageData = m_dataPages[page];
for (int i = 0; i < pageData.size(); ++i) {
YX_INFO* data = pageData[i];
QList<QStandardItem*> items;
QStandardItem* item = new QStandardItem(data->point_no);
items.append(item);
m_itemHash.insert(data->point_no, item);
item = new QStandardItem(data->info_desc);
items.append(item);
item = new QStandardItem(data->yx_bit);
items.append(item);
item = new QStandardItem(data->action_time);
items.append(item);
item = new QStandardItem(data->reset_time);
items.append(item);
item = new QStandardItem(data->verify_time);
items.append(item);
item = new QStandardItem(data->confirm_status);
items.append(item);
item = new QStandardItem();
item->setData(QPixmap(data->confirm ? ":/confirm.png" : ":/cancel.png"), Qt::DecorationRole);
item->setData(data->confirm ? tr("已确认") : tr("已取消"), Qt::DisplayRole);
items.append(item);
item = new QStandardItem(data->channel_type);
items.append(item);
appendRow(items);
}
}
```
阅读全文