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

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!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值