// ModelViewTable.h
class QStandardItemModel;
class QMenu;
class ModelViewTable : public QWidget
{
Q_OBJECT
public:
ModelViewTable(QWidget *parent = Q_NULLPTR);
void generateDataSet();
void addRowRecord(int row);
void setColumnItem(int row, int column, QString ip);
public slots:
void slotShowContextMenu(const QPoint& point);
private:
Ui::ModelViewTableClass ui;
QStandardItemModel * m_model;
QMenu* m_contextMenu;
};
// ModelViewTable.cpp
ModelViewTable::ModelViewTable(QWidget *parent)
: QWidget(parent)
{
ui.setupUi(this);
//////////////////////////设置表头/////////////////////
m_model = new QStandardItemModel(this);
m_model->setColumnCount(3);
m_model->setHeaderData(0, Qt::Horizontal, QStringLiteral("终端IP"));
m_model->setHeaderData(1, Qt::Horizontal, QStringLiteral("CPU使用率"));
m_model->setHeaderData(2, Qt::Horizontal, QStringLiteral("内存使用率"));
ui.tableView->resizeColumnsToContents(); // 自适应列宽
ui.tableView->setSortingEnabled(true); // 可以按列来排序
ui.tableView->setModel(m_model);
ui.tableView->horizontalHeader()->setDefaultAlignment(Qt::AlignHCenter);
ui.tableView->horizontalHeader()->setFont(QFont("Times",10,QFont::Bold));
ui.tableView->setSelectionBehavior(QAbstractItemView::SelectRows); //整行选中
ui.tableView->setEditTriggers(QAbstractItemView::NoEditTriggers);// 表格单元格为只读
ui.tableView->setContextMenuPolicy(Qt::CustomContextMenu); // 可以自定义右键菜单
m_contextMenu = new QMenu(this);
QAction *processAct = new QAction(QStringLiteral("进程列表信息"),m_contextMenu);
QAction *windowAppsAct = new QAction(QStringLiteral("窗口应用列表信息"),m_contextMenu);
m_contextMenu->addAction(processAct);
m_contextMenu->addAction(windowAppsAct);
connect(ui.tableView, SIGNAL(customContextMenuRequested(const QPoint&)),
this, SLOT(slotShowContextMenu(const QPoint&)));
}
void ModelViewTable::generateDataSet()
{
for (int i = 0; i < 3000; ++i)
{
addRowRecord(i);
}
}
void ModelViewTable::addRowRecord(int row)
{
// 每行3列
QString ip = QString("%1.%2.%3.%4").arg(192).arg(168).arg(1).arg(row);
setColumnItem(row, 0, ip);
QString cpu = QString("%1").arg((row * 10) % 100);
setColumnItem(row, 1, cpu);
QString mem = QString("%1").arg((row * 12) % 100);
setColumnItem(row, 2, mem);
}
void ModelViewTable::slotShowContextMenu(const QPoint& point)
{
QModelIndex index = ui.tableView->indexAt(point);
if (index.isValid())
{
m_contextMenu->exec(QCursor::pos());
}
}
void ModelViewTable::setColumnItem(int row, int column, QString ip)
{
m_model->setItem(row, column, new CustomStandardItem(ip));
m_model->item(row, column)->setTextAlignment(Qt::AlignCenter);
}
// CustomStandardItem.h
// 自定义数值排序
class CustomStandardItem : public QStandardItem
{
// Q_OBJECT
public:
CustomStandardItem();
CustomStandardItem(const CustomStandardItem& other);
CustomStandardItem(const QString &text);
CustomStandardItem & operator =(const CustomStandardItem& other);
~CustomStandardItem();
public:
virtual bool operator<(const QStandardItem& other) const override;
};
//CustomStandardItem.cpp
CustomStandardItem::CustomStandardItem()
{
}
CustomStandardItem::CustomStandardItem(const CustomStandardItem& other)
:QStandardItem(other)
{
}
CustomStandardItem::CustomStandardItem(const QString &text)
:QStandardItem(text)
{
}
CustomStandardItem::~CustomStandardItem()
{
}
CustomStandardItem & CustomStandardItem::operator=(const CustomStandardItem& other)
{
QStandardItem::operator=(other);
return *this;
}
bool CustomStandardItem::operator<(const QStandardItem& other) const
{
const QVariant left = data(Qt::DisplayRole), right = other.data(Qt::DisplayRole);
// 第1到2列,全部采用浮点数的大小排序
if (column() == other.column() && other.column() >= 1 && other.column() <= 2)
{
return left.toDouble() < right.toDouble();
}
return QStandardItem::operator<(other);
}
原文始发于微信公众号(汇编语言):Qt5中表格处理大数据量
免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论