2016-12-12 9 views
1

필터링에 사용되는 QAbstractTableModel 및 QSortFilterProxyModel의 사용자 지정 구현이 있습니다. 테이블은 QTableView에 표시됩니다.QStatusBar에서 QAbstractTableModel의 상태를 표시하는 방법은 무엇입니까?

내 QTableView의 상위 대화 상자에는 읽기 전용 QLineEdit 위젯이있는 QStatusBar가 있습니다.

QAbstractTableModel의 재정의 된 data() 메서드에서 Qt :: StatusTipRole 역할에 대한 관련 값을 설정하고 있습니다.

이제 배관의 일부가 누락되었습니다. 셀당 StatusTipRole 데이터가 QStatusBar의 위젯에 표시되도록하려면 어떻게해야합니까?

+0

, 당신은 QTableView의 상속 신호 ['clicked'] (HTTP를 연결할 수 있습니다. qt.io/qt-4.8/qabstractitemview.html#clicked) 텍스트를 가져오고 QStatusBar :: setText()를 적절히 호출하는 함수 –

+0

아이디어는 마우스가 움직이는 셀을 기반으로 상태 막대를 업데이트하는 것입니다. 나는 TableView의 mouseMoveEvent 신호를위한 슬롯을 가짐으로써이 동작을 얻을 수 있었지만, 필터링이 포함될 때 실패하고, 그 시점에서 모델 데이터에 접근 할 수 없다. – jehuty

+0

[이 스레드] (http://www.qtcentre.org/threads/50677-Problem-with-QTableView-and-QSortFilterProxyModel)에는이 문제에 대한 토론이 있습니다. –

답변

3

보기 위젯을 재정의 할 필요가 없습니다. Qt는 모델의 항목에 대한 상태 정보를 보여주기위한 내장 지원을 제공합니다.

일반적으로는, 당신은에서 QString을 반환해야 모델의 data()roleQStatusTipRole, 당신이 당신의 품목을 가져 때 QString 상태 표시 줄에 표시됩니다 때.

QTableView의 경우 mouse tracking을 켜야 마우스 단추를 누르지 않고 상태 표시 줄을 업데이트 할 수 있습니다. 이는 마우스 추적이 사용되지 않으면 (기본적으로) 위젯이 마우스 버튼을 누르고있는 동안에 만 마우스 이동 이벤트를 수신하기 때문입니다.

자, 대신 기본 상태 표시 줄의 당신의 QLineEdit에서 그 상태 도움말을 표시하기 위해, 당신은 당신의 QLineEdit에 메인 윈도우의 event 기능, 차단 QStatusTipEvent들, 그리고 쇼 팁을 대체 할 수 있습니다. 여기

이 예제 구현 : // 문서 : 당신이 QStatusBar은 마우스 클릭에 업데이트 할 가정

screenshot

#include <QtWidgets> 

//model to provide dummy data 
class MyModel : public QAbstractTableModel{ 
public: 
    explicit MyModel(QObject* parent= nullptr):QAbstractTableModel(parent){} 
    ~MyModel() = default; 
    int columnCount(const QModelIndex &parent) const{ 
     if(parent.isValid()) return 0; 
     return 4; 
    } 
    int rowCount(const QModelIndex &parent) const{ 
     if(parent.isValid()) return 0; 
     return 20; 
    } 
    QVariant data(const QModelIndex &index, int role) const{ 
     QVariant val; 
     switch(role){ 
     case Qt::DisplayRole: case Qt::EditRole: 
      val= QString("Display (%1, %2)") 
        .arg(index.row(), 2, 10, QChar('0')) 
        .arg(index.column(), 2, 10, QChar('0')); 
      break; 
     case Qt::ToolTipRole: 
      val= QString("Tooltip (%1, %2)") 
        .arg(index.row(), 2, 10, QChar('0')) 
        .arg(index.column(), 2, 10, QChar('0')); 
      break; 
     case Qt::StatusTipRole: 
      val= QString("StatusTip (%1, %2)") 
        .arg(index.row(), 2, 10, QChar('0')) 
        .arg(index.column(), 2, 10, QChar('0')); 
      break; 

     } 
     return val; 
    } 
}; 


class MainWindow : public QMainWindow{ 
    Q_OBJECT 
public: 
    explicit MainWindow(QWidget* parent= nullptr):QMainWindow(parent){ 
     //set up GUI 
     layout.addWidget(&lineEditFilter); 
     layout.addWidget(&tableView); 
     setCentralWidget(&cw); 
     lineEditStatusBar.setReadOnly(true); 
     statusBar()->addPermanentWidget(&lineEditStatusBar); 

     //set up models 
     filterModel.setSourceModel(&model); 
     tableView.setModel(&filterModel); 
     connect(&lineEditFilter, &QLineEdit::textChanged, this, &MainWindow::updateFilter); 

     //turn on mouse tracking for the table view 
     tableView.setMouseTracking(true); 

    } 
    ~MainWindow()= default; 

    Q_SLOT void updateFilter(const QString& text){ 
     filterModel.setFilterFixedString(text); 
    } 
protected: 

    //in order to intercept QStatusTipEvents 
    //and show tips in the line edit instead of the normal status bar 
    bool event(QEvent *event){ 
     if(event->type() != QEvent::StatusTip) return QMainWindow::event(event); 
     QStatusTipEvent* statusTipEvent= static_cast<QStatusTipEvent*>(event); 
     lineEditStatusBar.setText(statusTipEvent->tip()); 
     statusTipEvent->ignore(); 
     return true; 
    } 

private: 
    QWidget cw; 
    QVBoxLayout layout{&cw}; 
    QLineEdit lineEditFilter; 
    QTableView tableView; 
    MyModel model; 
    QSortFilterProxyModel filterModel; 
    QLineEdit lineEditStatusBar; 
}; 

int main(int argc, char *argv[]) 
{ 
    QApplication a(argc, argv); 

    MainWindow mw; 
    mw.show(); 


    return a.exec(); 
} 

#include "main.moc" 
+0

자세한 예를 들어 주셔서 감사합니다 - 이것은 내가 찾고 있었던 것입니다. 샘플 코드를 가지고 놀고 난 후에는 메인 대화 상자가 QMainWindow가 아닌 ​​QDialog라는 것을 알게되었습니다. 그것을 변경하는 것은 내 통제에서 벗어나므로 마우스 이벤트를 듣고 모델 -> 데이터()를 직접 호출하는 것은 불행합니다. – jehuty

+0

@jehuty, 당신은 여전히'QDialog' 서브 클래스와 같은 접근법을 사용할 수 있습니다. 내가 당신의 문제를 올바르게 이해했다면, [여기] (http://pastebin.com/Dd55dzsB)는'MainWindow'가'QDialog' 서브 클래스가되도록 수정 한 이후의 동일한 예입니다. – Mike

+0

"마우스 추적을 설정해야합니다 ...". 고맙습니다! – nicolai