前言
最近比较倒霉,电脑的固态盘崩了,资料代码都没了o(╥﹏╥)o。领悟到人生需要后路:要做好备份!所以我的博客,以后可能会出现很多零散的小知识。这篇博客就是其一,好嘞,废话不多说,正文开始!
功能介绍
消息日志主要是靠QTableWidget进行展示,有上下翻页的功能,虽然看似很简单,其实有很多需要考虑的地方,如按时间先后顺序排序,有新消息传来各部分的变动等。
知识点
这个小界面主要用到的控件是QTableWidget,这是个经常用到,但性能属性老是忘记的控件。所以下面对QTableWidget的用法进行总结。
QTableWidget类,提供一个带有默认模型、基于项(item-based)的表格视图。它的项是由QTableWidgetItem类提供。若是想用自己的数据模型,那么用他的父类QTableView更合适。
QTableWidget相对QTableView比较特殊的就是:拥有自己的数据模型,故不需将重点放在模型部分;在使用的时候,切记要提前设置表格的行列数(或动态添加),不然数据是不会显示出来的。
QTableWidget部分介绍
(1)设置行列数
QTableWidget(int rows, int columns, QWidget *parent = Q_NULLPTR) //构造设置
void setRowCount(int rows) int rowCount() const //设置行数及获取
void setColumnCount(int columns) int columnCount() const //设置列数及获取
(2)设置表头
//QTableWidget:
void setHorizontalHeaderLabels(const QStringList &labels) //添加横向表头
void setVerticalHeaderLabels(const QStringList &labels) //添加垂直表头
//QHeaderView
void setStretchLastSection(bool stretch) //最后部分是否占满表(一般横表头用,即最后一列填满剩余空间)
void resizeSection(int logicalIndex, int size) //重设索引所指部分的大小(横表头指宽,垂直表头指高)
void setSectionResizeMode(ResizeMode mode) //设置部分大小调整模式(互动、伸展、按内容自调整等)
(3)属性设置(枚举参考帮助文档,这里不具体列举)
void setEditTriggers(EditTriggers triggers) //编辑设置(双击编辑、任意键编辑、不能编辑等)
void setSelectionBehavior(QAbstractItemView::SelectionBehavior behavior) //选中行为(选中单个单元格、 整行选中 等)
void setSelectionMode(QAbstractItemView::SelectionMode mode) //选中模式(不能选、选中单个目标 等)
void setFrameShape(Shape) //设置边框(无边框,只显示横边框等)
void setShowGrid(bool show) //是否显示网格
(4)添加项(下面两个函数经常一起使用,动态添加)
void setItem(int row, int column, QTableWidgetItem *item) //设置某行某列为某项
void insertRow(int row) //在某行后插入一行
(5)清除
QTableWidgetItem *takeItem(int row, int column) //移除行列所对应的项,但没删除
void removeRow(int row) //删除某行
void clearContents() //清除所有内容(不包含表头)
代码
//.h文件
private slots:
void on_pageUpButton_clicked(); //上一页
void on_pageDownButton_clicked(); //下一页
void on_toolButton_clicked(); //添加数据
public:
void refreshData(); //刷新数据
private:
Ui::TaskLog *ui;
int m_MsgSum; //信息总数
int m_curPage; //当前页码
QStringList m_Data; //存储消息的时间和内容
//.cpp文件
//构造函数 初始化和设置属性
this->setWindowTitle(QString("消息日志"));
this->setWindowIcon(QIcon(":/res/yellowChild.png"));
ui->tableWidget->horizontalHeader()->setStretchLastSection(true);
ui->tableWidget->setEditTriggers(QAbstractItemView::NoEditTriggers);
ui->tableWidget->setSelectionBehavior(QAbstractItemView::SelectRows);
ui->tableWidget->setSelectionMode(QAbstractItemView::SingleSelection);
//设置按钮使能
ui->pageDownButton->setEnabled(false);
ui->pageUpButton->setEnabled(false);
//数据初始化
m_MsgSum=0;
m_curPage=1;
void TaskLog::on_pageUpButton_clicked()
{
//更新页码
m_curPage--;
int pageNum=m_MsgSum/10+1;
QString page=QString("%1/%2").arg(m_curPage).arg(pageNum);
ui->curPagLabel->setText(page);
//按钮使能
if(!ui->pageDownButton->isEnabled())
ui->pageDownButton->setEnabled(true);
if(m_curPage==1)
ui->pageUpButton->setEnabled(false);
//刷新数据
refreshData();
}
void TaskLog::on_pageDownButton_clicked()
{
//更新页码
m_curPage++;
int pageNum=m_MsgSum/10+1;
QString page=QString("%1/%2").arg(m_curPage).arg(pageNum);
ui->curPagLabel->setText(page);
//按钮使能
if(!ui->pageUpButton->isEnabled())
ui->pageUpButton->setEnabled(true);
if(pageNum==m_curPage)
ui->pageDownButton->setEnabled(false);
//刷新数据
refreshData();
}
void TaskLog::addTaskMessage(const QString &data)
{
Q_UNUSED(data);
}
void TaskLog::on_toolButton_clicked()
{
m_MsgSum++;
//更新页码
int pageNum=m_MsgSum/10+1;
QString page=QString("%1/%2").arg(m_curPage).arg(pageNum);
ui->curPagLabel->setText(page);
//按钮使能
if(m_curPage<pageNum)
ui->pageDownButton->setEnabled(true);
if(ui->tableWidget->rowCount()>=10)
{
ui->tableWidget->removeRow(9);
}
QString time=QDateTime::currentDateTime().toString("MM-dd hh:mm:ss");
QString content=QString("内容%1").arg(m_MsgSum);
QString data=time+"_"+content;
m_Data.append(data);
int index=m_MsgSum-1-(m_curPage-1)*10;
QString msg=m_Data.at(index);
QStringList strList=msg.split("_");
ui->tableWidget->insertRow(0);
ui->tableWidget->setItem(0,0,new QTableWidgetItem(strList.at(0)));
ui->tableWidget->setItem(0,1,new QTableWidgetItem(strList.at(1)));
}
void TaskLog::refreshData()
{
ui->tableWidget->clearContents();
ui->tableWidget->setRowCount(0);
int index=m_MsgSum-1-(m_curPage-1)*10;
if(index>9)
{
for(int i=index-9;i<=index;i++)
{
QString msg=m_Data.at(i);
QStringList strList=msg.split("_");
ui->tableWidget->insertRow(0);
ui->tableWidget->setItem(0,0,new QTableWidgetItem(strList.at(0)));
ui->tableWidget->setItem(0,1,new QTableWidgetItem(strList.at(1)));
}
}
else {
for(int i=0;i<=index;i++)
{
QString msg=m_Data.at(i);
QStringList strList=msg.split("_");
ui->tableWidget->insertRow(0);
ui->tableWidget->setItem(0,0,new QTableWidgetItem(strList.at(0)));
ui->tableWidget->setItem(0,1,new QTableWidgetItem(strList.at(1)));
}
}
}
效果图
结束语
QTableWidget还有很多用法,我只列举了几个简单的、常用的。还有一句,加油ヾ(◍°∇°◍)ノ゙