Qt: QTableView安装了事件过滤器无效的问题 Qt: QTableView的当前行改变时的信号,

一、QTableView安装了事件过滤器无效的问题*
QTableWidget无法响应鼠标点击(QMousePressEvent)的问题
QTableView派生于QAbstractScollArea,过滤器要安装在viewport。
使用Qt的事件过滤器,捕获QTableWidget的视窗(viewPort)所发生的事件。
此处需要注意,必须是为tableWidget的viewport安装事件过滤器

//初始化
ui->tableView->viewport()->installEventFilter(this);`

父窗口重写bool eventFilter(QObject *obj, QEvent *e) 函数

bool MainWidget::eventFilter(QObject *obj, QEvent *e)
{
	if (obj == tablewidget->viewport())
	{
		if (e->type() == QEvent::MouseButtonPress)
		{
			emit sig_focusChanged();
		}
	}
	return QWidget::eventFilter(obj,e);
}

二、Qt: QTableView的当前行改变时的信号

LogServerForm::LogServerForm(QWidget *parent) :
IForm(parent),
ui(new Ui::LogServerWgt)
{
	ui->setupUi(this);
	this->setIFormFlags((int)(E_FormCanFaultCancel | E_FormCanAddDiluent | E_FormCanIntoSleep | E_FormCanAutoMaintain));
	this->setWindowFlags(Qt::FramelessWindowHint|Qt::WindowStaysOnTopHint);//隐藏标题设置为顶层显示

	LogModel = new LogView(this);
	LogBL = new LogServerBL;
	//详细信息dialog
	logDetailInfoDialog = new LogDetailInfoDialog;
	//导出
	logExPortDialog = new LogExportDialog;
	//故障码查询
	logFaultCodeSearchDlg = new LogFaultCodeSearchDlg;

	UiStyleSettingInit();
	ui->tableView->viewport()->installEventFilter(this);

	connect(this,SIGNAL(sendToDetailInfoDlg(QString)),logDetailInfoDialog,SLOT(showInfo(QString)));
	connect(this,SIGNAL(sendToLogExportDilog(ELogType,int)),logExPortDialog,SLOT(selectInfo(ELogType,int)));

	// 注释框槽函数
	ui->tableView->setModel(LogModel);
	connect(ui->tableView->selectionModel(),SIGNAL(currentRowChanged(const QModelIndex&,const 		QModelIndex&)),
	this,SLOT(selectRowChange(const QModelIndex&,const QModelIndex&)));
	//connect(ui->tableView,SIGNAL(pressed(QModelIndex)),this,SLOT(CommentBoxShow(QModelIndex)));

	ui->Button_FaultInfo->setText(SpecialStringTs0::tr("故障信息"));
	ui->Button_FaultCodeCheck->setText(SpecialStringTs0::tr("故障码查询"));
	ui->Button_SequenceRunning->setText(SpecialStringTs0::tr("时序运行"));
	ui->Button_ParameterModify->setText(SpecialStringTs0::tr("参数修改"));
}

当前行改变时, QTableView并不提供信号, 而是他的SelectionModel发出信号. 这个连接只有在setModel()后才有用, 当model改变后, 这个连接也会失去作用, 而要再新的model设置后再调用一次.

在buildModel()时, 传入的model会被删除, 然后再为其创建一个新的model, 这时, 与tableView相关连的model被删除了, 所以他的SelectionModel也被删除, 与这个SelectionModel相关的连接也被自动删除, 所以在setModel()后, tableView会有一个新的SelectionModel, 也要对其进行新的信号糟连接.

  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值