qt的QTableView使用

9 篇文章 0 订阅
9 篇文章 0 订阅
//本次介绍的很常用的表格对象:
QTableView      * m_tbvSyncing;

//由UI文件创建对象方式:
m_tbvSyncing = qFindChild <QTableView *>( m_wgtSync, "tbvSyncing" );

//允许右键表格
m_tbvSyncing->setContextMenuPolicy (Qt ::CustomContextMenu );

//右键表格后显示的菜单
QMenu *m_meuSyncing = new QMenu( m_wgtSyncing);

connect(m_tbvSyncing , SIGNAL( customContextMenuRequested(QPoint )), this, SLOT(ShowSyncingContextMenu (QPoint )));

void LHSyncClientPrivate ::ShowSyncingContextMenu (QPoint )
{
    m_meuSyncing->addAction( m_actResume);
    m_meuSyncing->addAction( m_actStop);
    m_meuSyncing->addAction( m_actPause);
    m_meuSyncing->addSeparator();
    m_meuSyncing->addAction( m_actDetails);
    m_meuSyncing->exec( QCursor:: pos());
}


// 表格通过QStandardItemModel修改其值
QStandardItemModel *m_SyncingModel = new QStandardItemModel();

//设置列数
m_SyncingModel->setColumnCount (8 );

m_tbvSyncing->setModel (m_SyncingModel);

//设置表头
QStringList lstSyncingHeader;
lstSyncingHeader << "id"
    << QObject:: tr( "Filename")
    << QObject:: tr( "Progress")
    << QObject:: tr( "Speed")
    << QObject:: tr( "Status")
    << QObject:: tr( "Datetime")
    << "type"
    << "Transferred";
m_SyncingModel->setHorizontalHeaderLabels (lstSyncingHeader);

//隐藏一些不需要显示的列
m_tbvSyncing->horizontalHeader ()->hideSection (0 );
m_tbvSyncing->horizontalHeader ()->hideSection (5 );
m_tbvSyncing->horizontalHeader ()->hideSection (6 );
m_tbvSyncing->horizontalHeader ()->hideSection (7 );
m_tbvSyncing->horizontalHeader ()->setFont (QFont ("Simsun" , 12));

//获取当前鼠标位置的行信息
if (!m_tbvSyncing-> currentIndex().isValid ())
{
    LHParameters Parameters;
    Parameters["btnMessageBox_1"] = QObject ::tr ("Ok" );
    QString strResult;
    m_UiLoader->ShowMessage (strResult, QMessageBox ::Information ,
        QObject:: tr( "VSO CloudBox Client"),
        QObject:: tr( "Please select one item before invoking the command!"), Parameters);
}

int nRow = m_tbvSyncing-> currentIndex().row (); // 获取当前行号
QModelIndex mdlIndex = m_tbvSyncing-> currentIndex().sibling (nRow, 0); // 获取当前行的第0列

int nRecordId = m_SyncingModel-> data( mdlIndex, Qt::DisplayRole). toInt(); // 获取当前值


//通过第0列查找,查找结果存在list里
QList < QStandardItem *> lstResult = m_SyncingModel-> findItems( QString:: number ( nTransferId ), Qt ::MatchExactly );
if ( lstResult. count () == 0 )
{
    // 如果没有,则在最后添加一行
    int nRow = m_SyncingModel -> rowCount (); // 获取当前行数,即为当前要插入的行号
    m_SyncingModel -> insertRow ( nRow );
    m_SyncingModel -> setItem ( nRow , 0 , new QStandardItem (Query . value (0 ).toString ()));
    m_SyncingModel -> setItem ( nRow , 1 , new QStandardItem (QFileInfo (Query . value ( 1 ).toString ()).fileName ()));
    m_SyncingModel -> setItem ( nRow , 2 , new QStandardItem (Query . value (2 ).toString ()));
    m_SyncingModel -> setItem ( nRow , 3 , new QStandardItem( 0));
    m_SyncingModel -> setItem ( nRow , 4 , new QStandardItem (QString ::number ( nState )));
    m_SyncingModel -> setItem ( nRow , 5 , new QStandardItem (Query . value (5 ).toDateTime ().toString ("yyyy-MM-dd hh:mm:ss" )));
    m_SyncingModel -> setItem ( nRow , 6 , new QStandardItem (Query . value (6 ).toString ()));
    m_SyncingModel -> setItem ( nRow , 7 , new QStandardItem (QString ::number ( nTransferredSize )));
}
else
{
    // 如果有,则先拿到第一条的item(所以最好确保id是唯一的,这样找到的item最多只有一条)
    QStandardItem* Item = lstResult. at( 0 );
    // 获取行号
    int nRow = Item ->row ();

    QStandardItem * item = NULL ;

    //! 0:id(hide)
    item = m_SyncingModel -> item ( nRow , 0 );
    item-> setText( Query. value( 0 ). toString ());

    //! 1:file name
    item = m_SyncingModel -> item ( nRow , 1 );
    item-> setText( QFileInfo ( Query . value ( 1). toString()). fileName());

    //! 2:size
    item = m_SyncingModel -> item ( nRow , 2 );
    item-> setText( QString :: number ( nTotalSize ));

    //! 3:Speed
    item = m_SyncingModel -> item ( nRow , 3 );
    item-> setText( QString :: number ( nSpeed));

    //! 4:Status
    item = m_SyncingModel -> item ( nRow , 4 );
    item-> setText( QString :: number ( nState));

    //! 5:DateTime
    item = m_SyncingModel -> item ( nRow , 5 );
    item-> setText( Query. value( 5 ). toDateTime (). toString ( "yyyy-MM-dd hh:mm:ss"));

    //! 6:type(hide)
    item = m_SyncingModel -> item ( nRow , 6 );
    item-> setText( Query. value( 6 ). toString ());

    //! 7:Transfered(hide)
    item = m_SyncingModel -> item ( nRow , 7 );
    item-> setText( QString :: number ( nTransferredSize ));
}


//删除所有行
m_SyncingModel->removeRows (0 , m_SyncingModel-> rowCount());

//删除某一行
QList<QStandardItem *> lstResult = m_SyncingModel-> findItems( QString:: number( nTransferId), Qt::MatchExactly );
QStandardItem* Item = lstResult .at (0 );
QModelIndex Index = m_SyncingModel-> indexFromItem(Item );
m_SyncingModel->removeRow (Index.row());

//删除某一行貌似可以简化成
QList<QStandardItem *> lstResult = m_SyncingModel-> findItems( QString:: number( nTransferId), Qt::MatchExactly );
QStandardItem* Item = lstResult .at (0 );
m_SyncingModel->removeRow (Item.row());
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Qt QTableView是一个用于显示数据的小部件。它可以让开发人员像在Excel中的表格一样显示和编辑数据。 QTableView支持多种数据显示格式,例如文本,图像和彩色表格。 它还具有丰富的转换和排序功能,可以方便地自定义样式表,折叠单元格,自动滚动和多列排序等功能。 QTableViewQt Model/View机制中的一个视图,是MVC(Model-View-Controller)设计模式的一种实现方式。 Model是存储数据的地方, View主要是界面的展示,而Controller则是用于连接Model和View的逻辑,负责处理用户的行为和数据的交互。在QTableView中,数据模型通常被实现为QAbstractTableModel的子类,专门负责数据的存储和处理。 QTableView则根据模型中的数据来显示表格,并响应用户的操作。 在实际使用中,开发人员需要自定义QAbstractTableModel并提供数据,同时将QTableView连接到模型中。 开发人员还可以使用Qt自带的数据模型(例如QSqlTableModel和QStandardItemModel)来轻松地将数据直接加载到表格中,这使得QTableView适用于各种应用程序,例如数据管理应用程序,报告应用程序,数据录入应用程序等。 总的来说,Qt QTableView提供了一个可定制的数据展示小部件,方便开发人员根据自己的需求来展示和操作不同的数据。由于它的灵活性和易用性,已经成为了许多Qt开发人员不可或缺的必备工具。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值