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!

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

QTableView实时更新数据

需要在模型的setData函数中添加两个函数: bool QTabveiwModel::setData(const QModelIndex &index, const QVariant &value...

VS2010+QT5编程之QTableView数字排序

很多人发现QTableView中的排序很不科学,比如列排序的一列数101、35、2、87、5、779,排序出来变成了101、2、35、5、779、87。再比如“中国”、“山东”、“济南”、“历下”这一...

QT5 +VS2010 SP1 解决中文乱码问题

QStringLiteral似乎解决解决显示中文的问题.所以不管是显示,还是使用QFile, QTextStream写入文件,在所有的文字前面都使用这个东西QStringLiteral就万无一失了。 ...

QT5 +VS2010 SP1 解决中文乱码问题

qt4和VS2008的中文支持,大家都知道的。就不说了。 qt5.2.1发布后,源码全部是UTF-8编码,但由于微软的问题,VS2010打上补丁VS2010sp1,加入#pragma executio...

VS2010+QT5开发所踩的坑以各种问题解决

fatal error C1083: 无法打开预编译头文件:“Debug\xxx.pch”: No such file or directory “Rebuild All”没有解决,然后把“C/C++...
  • zcyzsy
  • zcyzsy
  • 2017年06月14日 11:20
  • 226

通过静态编译(VS2010)解决发布qt4 release 版本时无图片问题

用QT的默认安装,把生成的release下的exe文件,和下面几个核心文件放在一个文件夹里: QTGUI4.DLL QTCORE4.DLL 文件在X:\Qt\4.7.1\bin目录中,切...

VS2010/VS2012/VS2013+QT5编程之开发环境配置

用VS+Qt5开发并不是什么难事,下面详细讲一下如何配置编译环境: 第一步:               安装VS和其对应的sp补丁包,网上很容易就能下载到安装包,傻瓜式安装,这里不多介绍。 第...

ARCGIS 10.0用 VS2010 c#编程问题解决

  • 2012年12月14日 17:09
  • 1022B
  • 下载

VS2010编程助手 (解决注册问题)

  • 2012年10月08日 19:18
  • 10.22MB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:VS2010+QT5编程之巧妙运用定时器解决QTreeView/QTableView等QAbstractItemView实时条目统计问题
举报原因:
原因补充:

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