VS2010+QT5编程之巧妙运用定时器解决QTreeView/QTableView等QAbstractItemView实时条目统计问题

原创 2015年07月06日 19:12:38

QTableView等QAbstractItemView常用来做为表格显示,但一般情况下会放在另一个大框架下。比如说我写了一个数据库编辑器,主框架界面是QMainWindow,包含菜单栏、工具栏、状态栏,QTableView里显示的是数据库获取到的表格数据。

可我想在状态栏显示QTableView里统计的实时选取条目的数目,说到这可能大家觉得问题太简单,写一个简单线程或者重写QTableView类里的mousePressEvent(QMouseEvent *event)单击响应函数不就行了?本着能不写线程就不写线程的原则,我决定重写QTableView类里的mousePressEvent(QMouseEvent *event)单击响应函数,代码如下:

class TableView : public QTableView
{
	Q_OBJECT

signals:
	void left_clicked();		//单击信号

protected:
	virtual void mousePressEvent(QMouseEvent *event)
	{
		if (event->button() == Qt::LeftButton)
		{
			emit left_clicked();		//发射单击信号
		}
		QTableView::mousePressEvent(event);
	}
};

TableView *centerView;
centerView = new TableView;
connect(centerView,SIGNAL(left_clicked()),this,SLOT(center_clicked()));

void MyDemo::center_clicked()
{
	QModelIndexList SelectedIndexList = centerView->selectionModel()->selectedIndexes();

	int nCount = SelectedIndexList.count();    //nCount就是QTableView里实时选取条目的数目
}

这样写是没问题的,但你会发现这个nCount的值并不准确,比如说你选中一条记录,结果发现nCount的值是0,你选了五条记录,nCount的值却是3,而3正是上一次选取记录的值。

出现这个问题的原因很简单,就是你发射单击信号left_clicked()的的时候,实际你单击的那一下在QTableView上还没来得及做出选择,简单来说就是单击信号left_clicked()发射的太快了。

解决方案也是非常简单,用定时器延迟发射单击信号left_clicked()就可以了。

代码修改如下:

class TableView : public QTableView
{
	Q_OBJECT

signals:
	void left_clicked();		//单击信号

protected:
	virtual void mousePressEvent(QMouseEvent *event)
	{
		if (event->button() == Qt::LeftButton)
		{
			QTimer *timer = new QTimer(this);
                        timer->singleShot(100,this,SIGNAL(left_clicked()));      //发射单击信号
		}
		QTableView::mousePressEvent(event);
	}
};

这样就改成了100ms后发射单击信号left_clicked(),一切OK!

版权声明:本文为博主原创文章,未经博主允许不得转载。

Qt QTableview使用

转自:http://www.cnblogs.com/lhb3188/archive/2012/02/09/2343614.html QTableWidget是QT程序中常用的显示数据表格的空间,很类...
  • addfourliu
  • addfourliu
  • 2012年06月20日 21:01
  • 6597

QTableView实时更新数据

需要在模型的setData函数中添加两个函数: bool QTabveiwModel::setData(const QModelIndex &index, const QVariant &value...
  • rongyong
  • rongyong
  • 2015年08月03日 17:44
  • 2310

QT5.5 动态刷新tabview

  • 2015年12月10日 21:52
  • 5KB
  • 下载

使用QStandardItemModel的QTableView,添加大量数据解决刷新卡顿问题

添加数据前: TableView->setUpdatesEnabled(false); //暂停界面刷新 添加大量数据过程。。。。 添加完毕后: TableView->setUp...
  • xbnlkdbxl
  • xbnlkdbxl
  • 2016年09月28日 11:08
  • 1958

VS2010+QT5编程之巧妙运用定时器解决QTreeView/QTableView等QAbstractItemView实时条目统计问题

QTableView等QAbstractItemView常用来做为表格显示,但一般情况下会放在另一个大框架下。比如说我写了一个数据库编辑器,主框架界面是QMainWindow,包含菜单栏、工具栏、状态...
  • godmaycry
  • godmaycry
  • 2015年07月06日 19:12
  • 788

Qt 实现实时系统时间显示

#include "mainwindow.h" #include int main(int argc, char *argv[]) { QApplication a(argc, argv)...
  • qq_24815615
  • qq_24815615
  • 2017年04月11日 15:21
  • 4099

一步步学Qt,第五天-Qt这样的小小差异你发现了多少

一步步学Qt,第5天-Qt这样的小小差异你发现了多少 今天下了一个小小得程序,一个小小的文件目录浏览器。在看到这个地方的时候,看到了Qt你们的Model/View模式,原本小弟疑问这个玩意没...
  • pingLinux
  • pingLinux
  • 2011年08月28日 10:40
  • 2180

VS2010+QT5编程之QTableView数字排序

很多人发现QTableView中的排序很不科学,比如列排序的一列数101、35、2、87、5、779,排序出来变成了101、2、35、5、779、87。再比如“中国”、“山东”、“济南”、“历下”这一...
  • godmaycry
  • godmaycry
  • 2015年06月10日 09:07
  • 2056

《Qt 实战一二三》

“我们来自Qt分享&&交流,我们来自QML分享&&交流”,不管你是笑了,还是笑了,反正我们是认真的。我们就是要找寻一种Hold不住的状态,来开始每一天的点滴分享,我们是一个有激情,有态度的部队。 但...
  • u011012932
  • u011012932
  • 2015年12月12日 18:58
  • 79775

QT实战

简介 “我们来自Qt分享&&交流,我们来自QML分享&&交流”,不管你是笑了,还是笑了,反正我们是认真的。我们就是要找寻一种Hold不住的状态,来开始每一天的点滴分享,我们是一个有激情,有态度的...
  • ds1130071727
  • ds1130071727
  • 2017年12月11日 11:48
  • 71
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:VS2010+QT5编程之巧妙运用定时器解决QTreeView/QTableView等QAbstractItemView实时条目统计问题
举报原因:
原因补充:

(最多只允许输入30个字)