VS2010+QT5编程之巧妙运用定时器解决QTreeView/QTableView等QAbstractItemView实时条目统计问题
2015-07-06 19:12
417 查看
QTableView等QAbstractItemView常用来做为表格显示,但一般情况下会放在另一个大框架下。比如说我写了一个数据库编辑器,主框架界面是QMainWindow,包含菜单栏、工具栏、状态栏,QTableView里显示的是数据库获取到的表格数据。
可我想在状态栏显示QTableView里统计的实时选取条目的数目,说到这可能大家觉得问题太简单,写一个简单线程或者重写QTableView类里的mousePressEvent(QMouseEvent *event)单击响应函数不就行了?本着能不写线程就不写线程的原则,我决定重写QTableView类里的mousePressEvent(QMouseEvent *event)单击响应函数,代码如下:
这样写是没问题的,但你会发现这个nCount的值并不准确,比如说你选中一条记录,结果发现nCount的值是0,你选了五条记录,nCount的值却是3,而3正是上一次选取记录的值。
出现这个问题的原因很简单,就是你发射单击信号left_clicked()的的时候,实际你单击的那一下在QTableView上还没来得及做出选择,简单来说就是单击信号left_clicked()发射的太快了。
解决方案也是非常简单,用定时器延迟发射单击信号left_clicked()就可以了。
代码修改如下:
这样就改成了100ms后发射单击信号left_clicked(),一切OK!
可我想在状态栏显示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!
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- 关于指针的一些事情
- QT学习 第一章:基本对话框
- 使用Shiboken为C++和Qt库创建Python绑定
- 肯特·贝克:改变人生的代码整理魔法
- 你应该学习哪种编程语言?
- c++ primer 第五版 笔记前言
- [转]我们需要一种其他人能使用的编程语言
- share_ptr的几个注意点
- DB2编程序技巧(1)
- DB2编程序技巧 (四)
- 女人VS编程_国庆快乐
- DB2编程序技巧 (六)
- DB2编程序技巧 (三)
- DB2编程序技巧 (九)
- DB2编程序技巧 (七)
- DB2编程序小小技巧
- DB2编程序技巧 (五)
- DB2编程序技巧 (一)
- DB2编程序技巧 (八)