2017-05-09 6 views
1

せずにサイズを変更あなたが見ることができるように私は隠された水平ヘッダーとQTableViewQTableView:対話型の列がQHeaderView

table->horizontalHeader()->hide(); 

No header view

、中央列のテキストがあるため、列幅のクリップされています。

テキストを表示するには、ユーザーは列のサイズを変更する必要がありますが、ヘッダーは表示されません。これを行うことはできません。

私ができることをしたいのは、マウスをコラムの端に持っていき、通常のサイズ変更アイコンが表示されていることです。次に、ユーザーが列をより広くドラッグできるようにします。

これは可能ですか?

+0

はたぶんソリューションはResizeColumnsToContents' 'とすべての列のサイズを変更するためのボタンを追加することです。 –

答えて

1

が...

/* 
* Subclass of QTableView that provides notification when the mouse cursor 
* enters/leaves a column boundary. 
*/ 
class headerless_table_view: public QTableView { 
    using super = QTableView; 
public: 
    explicit headerless_table_view (QWidget *parent = nullptr) 
    : super(parent) 
    , m_boundary_width(10) 
    , m_column_index(-1) 
    { 
     viewport()->setMouseTracking(true); 
     viewport()->installEventFilter(this); 
    } 

    /* 
    * @return The index of the column whose right hand boundary the cursor lies 
    *   on or -1 if not on a boundary. 
    */ 
    int column_index() const 
    { 
     return(m_column_index); 
    } 
protected: 
    virtual bool eventFilter (QObject *obj, QEvent *event) override 
    { 
     if (event->type() == QEvent::MouseMove) { 
     if (auto *e = dynamic_cast<QMouseEvent *>(event)) { 
      auto col_left = columnAt(e->pos().x() - m_boundary_width/2); 
      auto col_right = columnAt(e->pos().x() + m_boundary_width/2); 
      bool was_on_boundary = m_column_index != -1; 
      if (col_left != col_right) { 
      if (m_column_index == -1) { 
       if (col_left != -1) { 
       m_column_index = col_left; 
       } 
      } 
      } else { 
      m_column_index = -1; 
      } 
      bool is_on_boundary = m_column_index != -1; 
      if (is_on_boundary != was_on_boundary) { 
      entered_column_boundary(is_on_boundary); 
      } 
     } 
     } 
     return(super::eventFilter(obj, event)); 
    } 

    /* 
    * Called whenever the cursor enters or leaves a column boundary. if 
    * `entered' is true then the index of the column can be obtained using 
    * `column_index()'. 
    */ 
    virtual void entered_column_boundary (bool entered) 
    { 
    } 
private: 
    int m_boundary_width; 
    int m_column_index; 
}; 

/* 
* Subclass of headerless_table_view that allows resizing of columns. 
*/ 
class resizable_headerless_table_view: public headerless_table_view { 
    using super = headerless_table_view; 
public: 
    explicit resizable_headerless_table_view (QWidget *parent = nullptr) 
    : super(parent) 
    , m_dragging(false) 
    { 
     viewport()->installEventFilter(this); 
    } 
protected: 
    virtual bool eventFilter (QObject *obj, QEvent *event) override 
    { 
     if (auto *e = dynamic_cast<QMouseEvent *>(event)) { 
     if (event->type() == QEvent::MouseButtonPress) { 
      if (column_index() != -1) { 
      m_mouse_pos = e->pos(); 
      m_dragging = true; 
      return(true); 
      } 
     } else if (event->type() == QEvent::MouseButtonRelease) { 
      m_dragging = false; 
     } else if (event->type() == QEvent::MouseMove) { 
      if (m_dragging) { 
      int delta = e->pos().x() - m_mouse_pos.x(); 
      setColumnWidth(column_index(), columnWidth(column_index()) + delta); 
      m_mouse_pos = e->pos(); 
      return(true); 
      } 
     } 
     } 
     return(super::eventFilter(obj, event)); 
    } 

    /* 
    * Override entered_column_boundary to update the cursor sprite when 
    * entering/leaving a column boundary. 
    */ 
    virtual void entered_column_boundary (bool entered) override 
    { 
     if (entered) { 
     m_cursor = viewport()->cursor(); 
     viewport()->setCursor(QCursor(Qt::SplitHCursor)); 
     } else { 
     viewport()->setCursor(m_cursor); 
     } 
    } 
private: 
    bool m_dragging; 
    QPoint m_mouse_pos; 
    QCursor m_cursor; 
}; 

をイベントフィルタと、次の2つのクラスを使用して動作するように何かを手に入れた私はそれはきれいに見えたように、2つのクラスを渡ってそれを分割することになりました。マウスが列の境界上にあると、関連する境界をドラッグすることができたときにカーソルがスプライトの変更 - 単に私が見つけたいくつかの古いコード例ではresizable_headerless_table_viewQTableViewを置き換えるとにかく

は、所望の効果を持っているように見えました。

それはあなたが後にしている何にどれだけ近いかわからない、しかし...は

+0

うわー、それは最高です、ありがとう!私はそれを試してみましょう! –