2014-04-16 2 views
0

테이블을 나타내는 위젯을 만들고 일부 데이터를 업데이트하려고합니다. 이렇게하려면 Qt Model/View tutorial을 따르고 있습니다. QT 테이블/모델이 데이터를 호출하지 않습니다.

QTableView에서 상속 QAbstractTableModel

  • EmittersTableWidget에서 상속

    • EmittersTableModel (당신이 게시물의 끝에서 찾을 수)

      제작 한 수업은 내가 EmittersTableModel 객체를 havethe EmittersTableWidget의 전용 멤버로. 생성자에서 모델을 인스턴스화하고 setModel() 메서드를 사용합니다.

      데이터를 업데이트하려고하면 EmittersTableWidget :: setRadioData() 메서드를 호출하고 datachanged() 신호를 내 보냅니다.

      내가 디버거 확인했습니다 호출되지 않습니다

    • EmittersTableModel::data()
    • 을 호출되지 않습니다
    • EmittersTableModel::flags()
    • 라고

      • emit dataChanged(topLeft, bottomRight)
      • EmittersTableModel::columnCount()
      • 라고
      • EmittersTableModel::rowCount()라고합니다.

      자습서에 (setModel()을 사용하고 필요한 가상 함수를 구현하고 신호를 내 보냅니다) 모든 작업을 수행하고있는 것처럼 보입니다.

      내가 무엇이 누락 되었습니까?

      EmittersTableModel.h

      #include <QAbstractTableModel> 
      #include <QVector> 
      #include "Radio.h" 
      
      typedef QMultiMap<QString, MapScenario::Core::RadioPtr> PlayerRadioMap; 
      
      class EmittersTableModel : public QAbstractTableModel 
      { 
          Q_OBJECT 
      public: 
      
          EmittersTableModel(QObject *parent); 
          virtual int rowCount(const QModelIndex &parent = QModelIndex()) const ; 
          virtual int columnCount(const QModelIndex &parent = QModelIndex()) const; 
          virtual QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const; 
          virtual Qt::ItemFlags flags (const QModelIndex & index) const; 
          QVariant headerData(int section, Qt::Orientation orientation, int role) const; 
          void setRadioData(const PlayerRadioMap &xRadioMap); 
      
      private: 
      
          typedef struct 
          { 
          QString xName; 
          MapScenario::Core::RadioPtr pxRadio; 
          } TableRowData; 
      
          PlayerRadioMap m_xRadioMap; 
          QVector<TableRowData> m_xDataVector; 
      }; 
      

      EmittersTableModel.cpp

      #include "EmittersTableModel.h" 
      
      EmittersTableModel::EmittersTableModel(QObject *parent) 
      :QAbstractTableModel(parent) 
      { 
      } 
      
      int EmittersTableModel::rowCount(const QModelIndex & /*parent*/) const 
      { 
          return m_xDataVector.size() - 1; 
      } 
      
      int EmittersTableModel::columnCount(const QModelIndex & /*parent*/) const 
      { 
          return 8; 
      } 
      
      QVariant EmittersTableModel::data(const QModelIndex &index, int role) const 
      { 
          if (role == Qt::DisplayRole) 
          { 
          switch (index.column()) 
          { 
           case 0 : 
           { 
           return m_xDataVector.at(index.row()).xName; 
           } break; 
           case 1 : 
           { 
           return m_xDataVector.at(index.row()).pxRadio->getName(); 
           } break;  
          } 
          return QString("Row%1, Column%2") 
           .arg(index.row() + 1) 
           .arg(index.column() +1); 
          } 
          return QVariant(); 
      } 
      
      Qt::ItemFlags EmittersTableModel::flags(const QModelIndex &index) const 
      { 
          return Qt::ItemIsEnabled | Qt::ItemIsEditable; 
      } 
      
      QVariant EmittersTableModel::headerData(int section, Qt::Orientation orientation, int role) const 
      { 
          if (role == Qt::DisplayRole) 
          { 
          if (orientation == Qt::Horizontal) { 
           switch (section) 
           { 
           case 0: 
           return QString("Player"); 
           case 1: 
           return QString("Emitter"); 
           case 2: 
           return QString("Freq."); 
           case 3: 
           return QString("Power"); 
           case 4: 
           return QString("Modulation"); 
           case 5: 
           return QString("Freq. Hopp."); 
           case 6: 
           return QString("Silent"); 
           case 7: 
           return QString("Rec. Power"); 
           } 
          } 
          } 
          return QVariant(); 
      } 
      
      void EmittersTableModel::setRadioData(const PlayerRadioMap &xRadioMap) 
      { 
          m_xDataVector.clear(); 
          PlayerRadioMap::const_iterator xIt; 
          for (xIt = xRadioMap.begin(); xIt != xRadioMap.end(); ++xIt) 
          { 
          TableRowData xData; 
          xData.xName = xIt.key(); 
          xData.pxRadio = xIt.value(); 
          m_xDataVector.append(xData); 
          } 
      
          if (false == m_xDataVector.empty()) 
          { 
          QModelIndex topLeft = createIndex(0, 0); 
          QModelIndex bottomRight = createIndex(m_xDataVector.size() - 1, 7); 
          emit dataChanged(topLeft, bottomRight); 
          } 
      } 
      

      EmittersTableWidget.h

      #include <QTableView> 
      #include <QHeaderView> 
      #include <QMultiMap> 
      #include <boost/smart_ptr.hpp> 
      #include "EmittersTableModel.h" 
      #include "Scenario.h" 
      #include "Radio.h" 
      
      namespace MapScenario 
      { 
          namespace Core 
          { 
          class Player; 
          } 
      } 
      
      
      /** Class for the player properties table model window */ 
      class EmittersTableWidget : public QTableView 
      { 
          Q_OBJECT 
      public: 
      
          EmittersTableWidget(QWidget *xParent = 0); 
          ~EmittersTableWidget(); 
      
      public slots: 
      
          void refreshScenarioDataSlot(const MapScenario::Core::ScenarioPtr pxScenario); 
      
      private: 
      
          EmittersTableModel *m_pxModel; 
      
          void getTransmitterMap(const MapScenario::Core::ScenarioPtr pxScenario, PlayerRadioMap *pxRadioMap) const; 
          void sendDataToTableModel(const PlayerRadioMap &xRadioMap); 
      }; 
      

      EmittersTableWidget.cpp

      #include "EmittersTableWidget.h" 
      #include "Player.h" 
      #include "CoreException.h" 
      
      using MapScenario::Core::ScenarioPtr; 
      using MapScenario::Core::Radio; 
      using MapScenario::Core::PlayerPtr; 
      
      /////////////////////////////////////////////////////////////////////////////// 
      // PUBLIC SECTION               // 
      /////////////////////////////////////////////////////////////////////////////// 
      
      EmittersTableWidget::EmittersTableWidget(QWidget *xParent) 
      : QTableView(xParent) 
      { 
          m_pxModel = new EmittersTableModel(0); 
          setModel(m_pxModel); 
          horizontalHeader()->setVisible(true); 
          verticalHeader()->setVisible(false); 
          setShowGrid(true); 
          setGridStyle(Qt::NoPen); 
          setCornerButtonEnabled(false); 
          setWordWrap(true); 
          setAlternatingRowColors(true); 
          setSelectionMode(QAbstractItemView::SingleSelection); 
          setSelectionBehavior(QAbstractItemView::SelectRows); 
          setSortingEnabled(true); 
      } 
      
      EmittersTableWidget::~EmittersTableWidget() 
      { 
          delete m_pxModel; 
      } 
      
      /////////////////////////////////////////////////////////////////////////////// 
      // PUBLIC SLOTS SECTION              // 
      /////////////////////////////////////////////////////////////////////////////// 
      
      
      void EmittersTableWidget::refreshScenarioDataSlot(const ScenarioPtr pxScenario) 
      { 
          PlayerRadioMap xRadioMap; 
          getTransmitterMap(pxScenario, &xRadioMap); 
          sendDataToTableModel(xRadioMap); 
      } 
      
      void EmittersTableWidget::getTransmitterMap(const ScenarioPtr pxScenario, PlayerRadioMap *pxRadioMap) const 
      { 
          QVector<QString> xNameList; 
          QVector<QString>::const_iterator xNameIt; 
          QStringList::const_iterator xRadioIt; 
      
          pxScenario->getPlayersNameList(xNameList); 
          for (xNameIt = xNameList.begin(); xNameIt != xNameList.end(); ++xNameIt) 
          { 
          QStringList xRadioList; 
          PlayerPtr pxPlayer = pxScenario->getPlayer(*xNameIt); 
          pxPlayer->getRadioNameList(xRadioList); 
          for (xRadioIt = xRadioList.begin(); xRadioIt != xRadioList.end(); ++xRadioIt) 
          { 
           pxRadioMap->insert(pxPlayer->getName(), pxPlayer->getRadio(*xRadioIt)); 
          } 
          } 
      } 
      
      void EmittersTableWidget::sendDataToTableModel(const PlayerRadioMap &xRadioMap) 
      { 
          m_pxModel->setRadioData(xRadioMap); 
      } 
      
  • +0

    'EmittersTableWidget'을 보여 주십니까? – vahancho

    +0

    예, 프로그램을 실행하면 올바르게 표시됩니다. – Jepessen

    +0

    beginResetModel() 및 endResetModel()에서 모델 채우기를 시도해야합니까? – OnWhenReady

    답변

    0

    내 문제를 발견했습니다.

    튜토리얼에서 행과 열 번호가 항상 상수라고 가정했습니다. 대신 나는 0 행으로 시작한 다음 필요할 때 추가 또는 제거합니다.이를 위해, 나는 다음과 같은 방법을 다시 구현해야합니다

    • virtual bool insertRows(int row, int count, const QModelIndex &parent)
    • virtual bool insertColumns(int column, int count, const QModelIndex &parent)
    • virtual bool removeRows(int row, int count, const QModelIndex &parent)
    • virtual bool removeColumns(int column, int count, const QModelIndex &parent)

    는 같은 서브 클래스 섹션에서 QAbstractItemModel page에 설명했다. 이제 필 요할 때 행을 삽입 및 제거하고 테이블을 올바르게 업데이트합니다.

    관련 문제