一、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, 也要對其進行新的信號糟連接.