3

このバグを絞り込むことはできません、次の問題があるようです。

  • saveState()horizontalHeader()
  • アプリを再起動する
  • 列が 1 つ少なくなるようにモデルを変更する
  • restoreState()
  • 現在、何らかの理由で、headerview の状態が完全にめちゃくちゃになっています。新しい列を表示または非表示にすることも、適切な状態に戻すこともできません

これはあまり説明的ではありませんが、他の人が以前にこの問題を抱えていたことを願っています。

4

5 に答える 5

2

QMainWindow の場合、save/restoreStateはバージョン番号を取ります。QTableView の restoreState() はそうではないため、このケースを自分で管理する必要があります。

モデルが一致しない場合でも状態を復元したい場合は、次のオプションがあります。

  • 保存時にモデルに存在する列のリストとともに状態を保存するため、列が一致しない場合にデータからの復元を回避し、デフォルトのケースに戻すことができます
  • その場合を処理する独自の save/restoreState 関数を実装します (ugh)
  • 復元中の状態に偽/ダミーの列を提供するプロキシ モデルを追加し、その直後にそれらの列を削除します。
于 2009-12-10T15:05:47.427 に答える
1

とにかくバイナリブロブを返すだけなので、私は個人的にQtウィジェットでsaveState()/を使用することはありません。restoreState()設定ファイルを人間が読める形式で、単純な型にする必要があります。それはまた、この種の問題を取り除きます。

さらに、モデルがすでに設定されている場合にのみ(または同等の機能が)機能するQHeaderViewという厄介な問題があります。restoreState()結局、QHeaderView::sectionCountChanged()信号に接続して、そこから呼び出されたスロットに状態を設定しました。

于 2009-07-22T04:49:41.780 に答える
1

Boost Serializationを使用して作成したソリューションを次に示します。

多かれ少なかれ、新しい列と削除された列を処理します。私のユースケースで動作します。

  // Because QHeaderView sucks
  struct QHeaderViewState
  {
    explicit QHeaderViewState(ssci::CustomTreeView const & view):
      m_headers(view.header()->count())
    {
      QHeaderView const & headers(*view.header());
      // Stored in *visual index* order
      for(int vi = 0; vi < headers.count();++vi)
      {
        int           li     = headers.logicalIndex(vi);
        HeaderState & header = m_headers[vi];

        header.hidden               = headers.isSectionHidden(li);
        header.size                 = headers.sectionSize(li);
        header.logical_index        = li;
        header.visual_index         = vi;
        header.name                 = view.model()->headerData(li,Qt::Horizontal).toString();
        header.view                 = &view;
      }
      m_sort_indicator_shown   = headers.isSortIndicatorShown();
      if(m_sort_indicator_shown)
      {
        m_sort_indicator_section = headers.sortIndicatorSection();
        m_sort_order             = headers.sortIndicatorOrder();
      }
    }

    QHeaderViewState(){}

    template<typename Archive>
    void serialize(Archive & ar, unsigned int)
    {
      ar & m_headers;
      ar & m_sort_indicator_shown;
      if(m_sort_indicator_shown)
      {
        ar & m_sort_indicator_section;
        ar & m_sort_order;
      }
    }

    void
    restoreState(ssci::CustomTreeView & view) const
    {
      QHeaderView & headers(*view.header());

      const int max_columns = std::min(headers.count(),
                                       static_cast<int>(m_headers.size()));      

      std::vector<HeaderState> header_state(m_headers);
      std::map<QString,HeaderState *> map;
      for(std::size_t ii = 0; ii < header_state.size(); ++ii)
        map[header_state[ii].name] = &header_state[ii];

      // First set all sections to be hidden and update logical
      // indexes
      for(int li = 0; li < headers.count(); ++li)
      {
        headers.setSectionHidden(li,true);
        std::map<QString,HeaderState *>::iterator it =
          map.find(view.model()->headerData(li,Qt::Horizontal).toString());
        if(it != map.end())
          it->second->logical_index = li;
      }

      // Now restore
      for(int vi = 0; vi < max_columns; ++vi)
      {
        HeaderState const & header = header_state[vi];
        const int li = header.logical_index;
        SSCI_ASSERT_BUG(vi == header.visual_index);
        headers.setSectionHidden(li,header.hidden);
        headers.resizeSection(li,header.size);
        headers.moveSection(headers.visualIndex(li),vi);
      }
      if(m_sort_indicator_shown)
        headers.setSortIndicator(m_sort_indicator_section,
                                 m_sort_order);
    }

    struct HeaderState
    {
      initialize<bool,false>  hidden;
      initialize<int,0>       size;
      initialize<int,0>       logical_index;
      initialize<int,0>       visual_index;
      QString                 name;
      CustomTreeView const  *view;

      HeaderState():view(0){}

      template<typename Archive>
      void serialize(Archive & ar, unsigned int)
      {
        ar & hidden & size & logical_index & visual_index & name;
      }
    };

    std::vector<HeaderState> m_headers;
    bool                     m_sort_indicator_shown;
    int                      m_sort_indicator_section;
    Qt::SortOrder            m_sort_order; // iff m_sort_indicator_shown
  };
于 2010-04-03T22:39:45.947 に答える
0

機種変したら壊れそう!これらの関数は、サニティ チェックなしでプライベート クラス メンバー変数を直接保存および復元します。状態を復元してから、モデルを変更してみてください。

于 2009-07-22T04:23:14.970 に答える