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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM