消息日志(QTableWidget)--Qt

前言

最近比较倒霉,电脑的固态盘崩了,资料代码都没了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还有很多用法,我只列举了几个简单的、常用的。还有一句,加油ヾ(◍°∇°◍)ノ゙

  • 2
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值