1

この「すべてをチェック」のように、テキストでチェックボックスを使用する必要があります。

ここに画像の説明を入力

QStandardItemModel のヘッダーにあります。私はこのようにしてみました

QStandardItem* item0 = new QStandardItem("some text");
item0->setCheckable(true);
item0->setCheckState(Qt::Checked);
item0->setText("some text");

_model->setHorizontalHeaderItem(1, item0);

この方法は、ヘッダーではなくアイテムに対してのみ機能します。つまり、使用するアイテムに対してのみ機能します

_model->setItem(new QStandardItem(some_item);

QHeaderView を継承する独自のクラスを作成することについて聞いたことがありますが、これが私の問題に役立つかどうかはわかりません。これを達成する簡単な方法はありますか?

よろしく

4

2 に答える 2

1


私はこのようなことをしました:

QStandardItemModel *model = new QStandardItemModel(this);

ui->tableView->setModel(model);

QtCheckHeaderView *header = new QtCheckHeaderView(Qt::Horizontal, ui->tableView);


QtCheckHeaderView *vheader = new QtCheckHeaderView(Qt::Vertical, ui->tableView);

ui->tableView->setHorizontalHeader(header);
ui->tableView->setVerticalHeader(vheader);

QStandardItem *root = model->invisibleRootItem();
QList<QList<QStandardItem *> > items;
for (int i = 0; i < 10; ++i)
{
    QList<QStandardItem *> res;
    for (int j = 0; j < 1000; ++j)
    {
        res.append(new QStandardItem(QString("%1;%2").arg(j).arg(i)));
        vheader->addCheckable(j);
    }
    items.append(res);
    root->appendColumn(res);

    header->addCheckable(i);
}

これはうまくいきます。垂直および水平ヘッダーにテキストを含むチェックボックスを描画します。しかし、これは、このコードを MainWindow コンストラクターに配置した場合にのみうまく機能します。このコードをたとえばプッシュボタン関数に配置すると、これは機能しません。データは問題ありませんが、ヘッダーは表示されません。

ui->tableView->repaint();

動作しません。なぜこれが起こっているのか、および/またはこれを解決する方法を誰かが知っているのでしょうか? ご回答ありがとうございます

于 2014-01-14T19:29:28.213 に答える
0

Qt モデルは、ヘッダーの項目フラグをサポートしていません。ヘッダーとして使用されるアイテムにアイテム フラグを設定しても効果はありません。QHeaderView は描画チェックボックスをサポートしていません。QHeaderView のサブクラス化が最も簡単な方法だと思います。

こちらのFAQページを参考に実装例を書いてみました。このクラスは、QStandardItemModel を使用することを前提としており、そのヘッダー項目のフラグを使用します。誰かが他のモデル クラスを使用したい場合は、QAbstractItemModel をサブクラス化し、不足しているインターフェイスを実装し、headerview の実装を変更する必要があります。

class MyHeader : public QHeaderView
{
public:
  MyHeader(Qt::Orientation orientation, QWidget * parent = 0);

protected:
  QStandardItemModel* standard_model;
  virtual void paintSection(QPainter *painter, const QRect &rect, int logicalIndex) const;
  virtual void mousePressEvent(QMouseEvent *event);
  virtual void setModel(QAbstractItemModel* model);

};

MyHeader::MyHeader(Qt::Orientation orientation, QWidget *parent) : QHeaderView(orientation, parent)
{
  standard_model = 0;
}

void MyHeader::paintSection(QPainter *painter, const QRect &rect, int logical_index) const {
  painter->save();
  QHeaderView::paintSection(painter, rect, logical_index);
  painter->restore();
  if (standard_model && orientation() == Qt::Horizontal) {
    QStandardItem* item = standard_model->horizontalHeaderItem(logical_index);
    if (item && item->isCheckable()) {
      int offset = (height() - style()->pixelMetric(QStyle::PM_IndicatorHeight))/2;
      int pos = sectionViewportPosition(logical_index);
      QStyleOptionButton option;
      option.rect = QRect(offset + pos, offset,
                          style()->pixelMetric(QStyle::PM_IndicatorWidth),
                          style()->pixelMetric(QStyle::PM_IndicatorHeight));
      if (item->checkState() == Qt::Checked) {
        option.state = QStyle::State_On;
      } else {
        option.state = QStyle::State_Off;
      }
      option.state |= QStyle::State_Enabled;
      style()->drawPrimitive(QStyle::PE_IndicatorCheckBox, &option, painter);
    }
  }
}

void MyHeader::mousePressEvent(QMouseEvent *event) {
  int offset = (height() - style()->pixelMetric(QStyle::PM_IndicatorHeight))/2;
  if (standard_model && orientation() == Qt::Horizontal) {
    for(int logical_index = 0; logical_index < count(); logical_index++) {
      int pos = sectionViewportPosition(logical_index);
      QRect rect(offset + pos, offset,
                 style()->pixelMetric(QStyle::PM_IndicatorWidth),
                 style()->pixelMetric(QStyle::PM_IndicatorHeight));
      if (rect.contains(event->pos())) {
        QStandardItem* item = standard_model->horizontalHeaderItem(logical_index);
        if (item && item->isCheckable()) {
          item->setCheckState(item->checkState() == Qt::Checked ? Qt::Unchecked : Qt::Checked);
          return;
        }
      }
    }
  }
  QHeaderView::mousePressEvent(event);
}

void MyHeader::setModel(QAbstractItemModel *model) {
  QHeaderView::setModel(model);
  standard_model = qobject_cast<QStandardItemModel*>(model);
}

//usage
QTableView  view;
QStandardItemModel model;
model.setColumnCount(5);
QStandardItem* item0 = new QStandardItem("some text");
item0->setCheckable(true);
item0->setCheckState(Qt::Checked);
item0->setText("some text");
model.setHorizontalHeaderItem(0, item0);
view.setModel(&model);
MyHeader *myHeader = new MyHeader(Qt::Horizontal, &view);
view.setHorizontalHeader(myHeader);
view.show();
于 2013-12-27T08:49:51.563 に答える