Qt: QTableView安装了事件过滤器无效的问题 Qt: QTableView的当前行改变时的信号,
一、QTableView安装了事件过滤器无效的问题
QTableView派生于QAbstractScollArea,过滤器要安装在viewport。
初始化ui->tableView->viewport()->installEventFilter(this);
使用Qt的事件过滤器,捕获QTableWidget的视窗(viewPort)所发生的事件。
QTableWidget无法响应鼠标点击(QMousePressEvent)的问题
tablewidget->viewport()->installEventFilter(this);
此处需要注意,必须是为tableWidget的viewport安装事件过滤器
父窗口重写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, 也要对其进行新的信号糟连接.