Russian Qt Forum
Ноябрь 26, 2024, 01:29 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: QTableView - сортировка по нескольким столбцам  (Прочитано 11667 раз)
last
Гость
« : Май 26, 2010, 19:14 »

Как сделать сортировку по одному столбцу - понятно. А если нужно по нескольким? Посоветуйте если есть готовое решение.
Записан
Karl-Philipp
Гость
« Ответ #1 : Май 26, 2010, 19:17 »

В поиск по форуму!
Решение точно было Подмигивающий
Записан
last
Гость
« Ответ #2 : Май 26, 2010, 19:35 »

хм самое близкое что нашел http://www.prog.org.ru/topic_6585_0.html но это 2007 год, воды много утекло уже
Записан
crossly
Гость
« Ответ #3 : Май 26, 2010, 19:53 »

с того времени в дополнение появился только QSortFilterProxyModel...
Записан
Karl-Philipp
Гость
« Ответ #4 : Май 26, 2010, 19:57 »

last, вводим слово "сортировка" в поиск и получаем нужную ссылку  Показает язык
http://www.prog.org.ru/topic_12007_0.html
Записан
last
Гость
« Ответ #5 : Май 27, 2010, 03:08 »

Спасибо.
Записан
asvil
Гость
« Ответ #6 : Май 27, 2010, 20:24 »

Danger! PIMPL using.

qtheaderview.h
Код:
#ifndef QTHEADERVIEW_H
#define QTHEADERVIEW_H

#include <QtGui/QHeaderView>

/*!
  Класс виджета-заголовка.
  \li Показать/скрыть секции виджета
  \li Сортировать по одному/нескольким столбцам
  \li set|unset movable, highligh sections
* @class HeaderView headerview.h
*/

class QtHeaderViewPrivate;
class QtHeaderView : public QHeaderView
{
  Q_OBJECT
  Q_DECLARE_PRIVATE(QtHeaderView);
  Q_PROPERTY (SortFlag sortFlag READ sortFlag WRITE setSortFlag);
protected:
  QtHeaderView(QtHeaderViewPrivate &dd, Qt::Orientation orientation, QWidget* parent);
  QtHeaderViewPrivate * const d_ptr;
public:
  /*!
    Тип сортировки отображаемой виджетом
  * @enum SortFlag */
  enum SortFlag {
    NoSort, //! Нельзя сортировать
    SimpleSort, //! Сортировка по одному столбцу
    MultiSort, //! Сортировка по нескольким столбцам
  };
  Q_ENUMS(SortFlag);

  QtHeaderView(Qt::Orientation orientation, QWidget* parent = 0);
  virtual ~QtHeaderView();

  SortFlag sortFlag() const;
  void setSortFlag(SortFlag enable);

  // MultiSorting
  // Удалить индикатор сортировки
  void removeSortIndicator(int logicalIndex);
  // Удалить все индикаторы сортировки
  void clearSortIndicators();
  // Установлен ли индикатор
  bool isSortIndicatorShown(int logicalIndex) const;
  // Установить индикатор, если это уже второй индикатор справа отобразить число порядка
  // Если clearPrevious все стрелочки в столбцах удаляются
  void setSortIndicator(int logicalIndex, Qt::SortOrder order);
  // Какая стрелочка отображена для данной колонки. Если никакой, то результат Qt::Asceding
  Qt::SortOrder sortIndicatorOrder(int logicalIndex) const;
  // Список столбцов в которых производилась сортировка в том порядке в котором они добавлялись
  QList<int> sortIndicatorSections() const;
    // Остальное для менюшки Скрыть/показать столбцы
  virtual void setModel(QAbstractItemModel* model);
signals:
  void sortIndicatorsChanged();

public slots:
  void showAllColumns();

protected slots:
  void hideColumnAction();

  void showHideActionToggled(bool checked);

  void showHideMenuAboutToShow();

  void sortAscAction();
  void sortDescAction();
  void removeSortAction();

  void setMovableTriggered(bool movable);
  void setHighlightSectionsTriggered(bool highlight);

protected:
  // Отрисовка
  virtual void paintSection(QPainter *painter, const QRect &rect, int logicalIndex) const;

  void mousePressEvent(QMouseEvent *event);
  void mouseReleaseEvent(QMouseEvent *event);

  void mouseDoubleClickEvent(QMouseEvent *event);

  void contextMenuEvent(QContextMenuEvent *event);

  void checkOneColumn();
private:
  Qt::SortOrder sortIndicatorOrder() const;
  int sortIndicatorSection() const;
};

#endif // HEADERVIEW_H


Записан
asvil
Гость
« Ответ #7 : Май 27, 2010, 20:26 »

qtheaderview.cpp
Код:
#include "qtheaderview.h"
#include "private/qtheaderview_p.h"

#include <QtCore/QDebug>

#include <QtGui/QApplication>
#include <QtGui/QPainter>
#include <QtGui/QMenu>
#include <QtGui/QAction>
#include <QtGui/QMouseEvent>
#include <QtGui/QContextMenuEvent>

#include <QtGui/QInputDialog>


QtHeaderView::QtHeaderView(Qt::Orientation orientation, QWidget* parent)
  :QHeaderView(orientation, parent)
  , d_ptr(new QtHeaderViewPrivate())
{
  Q_D(QtHeaderView);
  d->q_ptr = this;

  d->sortFlag = NoSort;
  d->hideColumnAction = new QAction(tr("Hide"), this);
  d->hideColumnAction->setObjectName("HideColumnAction");
  d->hideColumnAction->setToolTip(tr("Hide table column"));

  d->showAllColumnsAction = new QAction(tr("Show all"), this);
  d->showAllColumnsAction->setObjectName("ShowAllColumnsAction");
  d->showAllColumnsAction->setToolTip(tr("Show all hidden columns"));

  d->showhideColumnActionMenu = new QAction(tr("Show/hide columns"), this);

  d->showHideColumnsMenu = new QMenu(this);
  d->showhideColumnActionMenu->setMenu(d->showHideColumnsMenu);


  d->sortSeparator = new QAction(this);
  d->sortSeparator->setSeparator(true);

  d->sortAscAction = new QAction(tr("Ascending order"), this);
  d->sortAscAction->setObjectName("SortAscAction");
  d->sortAscAction->setToolTip(tr("Set ascending order for column"));

  d->sortDescAction = new QAction(tr("Descending order"), this);
  d->sortDescAction->setObjectName("SortDescAction");
  d->sortDescAction->setToolTip(tr("Set descending order for column"));

  d->removeSortAction = new QAction(tr("Remove sort"), this);
  d->removeSortAction->setObjectName("RemoveSortAction");
  d->removeSortAction->setToolTip(tr("Unset sort for column"));

  QAction *a;

  a = d->movableAction = new QAction(tr("Moveable"), this);
  a->setObjectName("MovableAction");
  a->setCheckable(true);
  a->setChecked(isMovable());
  addAction(a);


  a = d->hightlightAction = new QAction(tr("Highlight"), this);
  a->setObjectName("HighlightAction");
  a->setCheckable(true);
  a->setChecked(highlightSections());
  addAction(a);

  setClickable(true);

  addAction(d->hideColumnAction);
  addAction(d->showAllColumnsAction);
  addAction(d->showhideColumnActionMenu);

  connect(d->movableAction, SIGNAL(triggered(bool))
          , this, SLOT(setMovableTriggered(bool)));
  connect(d->hightlightAction, SIGNAL(triggered(bool))
          , this, SLOT(setHighlightSectionsTriggered(bool)));
  connect(d->hideColumnAction, SIGNAL(triggered()),
          this, SLOT(hideColumnAction()));
  connect(d->showAllColumnsAction, SIGNAL(triggered()),
          this, SLOT(showAllColumns()));
  connect(d->showHideColumnsMenu, SIGNAL(aboutToShow())
          , this, SLOT(showHideMenuAboutToShow()));
  connect(d->sortAscAction, SIGNAL(triggered()),
          this, SLOT(sortAscAction()));
  connect(d->sortDescAction, SIGNAL(triggered()),
          this, SLOT(sortDescAction()));
  connect(d->removeSortAction, SIGNAL(triggered()),
          this, SLOT(removeSortAction()));

  setContextMenuPolicy(Qt::DefaultContextMenu);
}

QtHeaderView::QtHeaderView(QtHeaderViewPrivate &dd, Qt::Orientation orientation, QWidget* parent)
  :QHeaderView(orientation, parent)
  , d_ptr(&dd)
{
  Q_D(QtHeaderView);
  d->q_ptr = this;
}

QtHeaderView::~QtHeaderView()
{
  delete d_ptr;
}

QtHeaderView::SortFlag QtHeaderView::sortFlag() const
{
  Q_D(const QtHeaderView);
  return d->sortFlag;
}

void QtHeaderView::setSortFlag(SortFlag flag)
{
  Q_D(QtHeaderView);
  if (d->sortFlag != flag) {
    if (flag == SimpleSort || flag == MultiSort) {
      addAction(d->sortSeparator);
      addAction(d->sortAscAction);
      addAction(d->sortDescAction);
      addAction(d->removeSortAction);
    } else {
      removeAction(d->sortSeparator);
      removeAction(d->sortAscAction);
      removeAction(d->sortDescAction);
      removeAction(d->removeSortAction);
    }
    d->sortFlag = flag;
    clearSortIndicators();
  }
}

void QtHeaderView::removeSortIndicator(int logicalIndex)
{
  Q_D(QtHeaderView);

  d->removeSortIndicatorWithoutRepaint(logicalIndex);

  viewport()->repaint();
}

void QtHeaderView::clearSortIndicators()
{
  Q_D(QtHeaderView);

  d->clearSortIndicatorsWithoutRepaint();

  viewport()->repaint();
}

bool QtHeaderView::isSortIndicatorShown(int logicalIndex) const
{
  Q_D(const QtHeaderView);

  return (d->sortingColumns.contains(logicalIndex));
}

void QtHeaderView::setSortIndicator(int logicalIndex, Qt::SortOrder order)
{
  Q_D(QtHeaderView);

  if (logicalIndex > -1 && logicalIndex < count()) {
    d->sortingColumns.insert(logicalIndex, order);

    if (!d->orderList.contains(logicalIndex))
      d->orderList.append(logicalIndex);
  }

  viewport()->repaint();
}

QList<int> QtHeaderView::sortIndicatorSections() const
{
  Q_D(const QtHeaderView);
  return d->orderList;
}

Qt::SortOrder QtHeaderView::sortIndicatorOrder(int logicalIndex) const
{
  Q_D(const QtHeaderView);

  if (d->sortingColumns.contains(logicalIndex))
    return d->sortingColumns.value(logicalIndex);

  return Qt::AscendingOrder;
}

void QtHeaderView::paintSection(QPainter *painter, const QRect &rect, int logicalIndex) const
{
  Q_D(const QtHeaderView);

  if (isSortIndicatorShown(logicalIndex)) {
    QStyleOptionHeader opt;
    initStyleOption(&opt);
    QStyle::State state = QStyle::State_None;
    if (isEnabled())
        state |= QStyle::State_Enabled;
    if (window()->isActiveWindow())
        state |= QStyle::State_Active;

    QPoint cursorPos = mapFromGlobal(cursor().pos());
    bool containMouse = rect.contains(cursorPos);
    if (isClickable()) {
        if (containMouse)
            state |= QStyle::State_MouseOver;
        if (containMouse && (QApplication::mouseButtons() && (Qt::LeftButton || Qt::RightButton)))
            state |= QStyle::State_Sunken;
        else if (highlightSections()) {
          if (d->sectionIntersectsSelection(logicalIndex))
            //if (selectionModel()->columnIntersectsSelection(logicalIndex, rootIndex()))
                state |= QStyle::State_On;
// if (d->isSectionSelected(logicalIndex))
          //if (containMouse && (QApplication::mouseButtons() && (Qt::LeftButton || Qt::RightButton)))
              // state |= QStyle::State_Sunken;
        }
    }

    opt.sortIndicator = d->sortingColumns.value(logicalIndex)==Qt::AscendingOrder
                        ?QStyleOptionHeader::SortDown
                          :QStyleOptionHeader::SortUp;

    // setup the style options structure
    QVariant textAlignment = d->model->headerData(logicalIndex, orientation(),
                                                  Qt::TextAlignmentRole);
    opt.rect = rect;
    opt.section = logicalIndex;
    opt.state |= state;
    opt.textAlignment = Qt::Alignment(textAlignment.isValid()
                                      ? Qt::Alignment(textAlignment.toInt())
                                      : defaultAlignment());

    opt.iconAlignment = Qt::AlignVCenter;
    opt.text = d->model->headerData(logicalIndex, orientation(),
                                    Qt::DisplayRole).toString();
    if (d->orderList.count() > 1) {
      int i;
      for (i = 0; i < d->orderList.count(); ++i)
        if (d->orderList.at(i) == logicalIndex)
          break;
      // create your indication sort ordering sections
      opt.text.append('/');
      opt.text.append(QString::number(i+1));
                 // http://prog.org.ru
                 /*+ (d->sortingColumns.value(logicalIndex)==Qt::AscendingOrder
             ?QString(0x2193) : QString(0x2191))*/;
    }
    if (textElideMode() != Qt::ElideNone)
        opt.text = opt.fontMetrics.elidedText(opt.text, textElideMode(), rect.width() - 4);

    QVariant variant = d->model->headerData(logicalIndex, orientation(),
                                    Qt::DecorationRole);
    opt.icon = qvariant_cast<QIcon>(variant);
    if (opt.icon.isNull())
        opt.icon = qvariant_cast<QPixmap>(variant);
    QVariant foregroundBrush = d->model->headerData(logicalIndex, orientation(),
                                                    Qt::ForegroundRole);
    if (qVariantCanConvert<QBrush>(foregroundBrush))
        opt.palette.setBrush(QPalette::ButtonText, qvariant_cast<QBrush>(foregroundBrush));

    QPointF oldBO = painter->brushOrigin();
    QVariant backgroundBrush = d->model->headerData(logicalIndex, orientation(),
                                                    Qt::BackgroundRole);
    if (qVariantCanConvert<QBrush>(backgroundBrush)) {
        opt.palette.setBrush(QPalette::Button, qvariant_cast<QBrush>(backgroundBrush));
        opt.palette.setBrush(QPalette::Window, qvariant_cast<QBrush>(backgroundBrush));
        painter->setBrushOrigin(opt.rect.topLeft());
    }

    // the section position
    int visual = visualIndex(logicalIndex);
    Q_ASSERT(visual != -1);
    if (count() == 1)
        opt.position = QStyleOptionHeader::OnlyOneSection;
    else if (visual == 0)
        opt.position = QStyleOptionHeader::Beginning;
    else if (visual == count() - 1)
        opt.position = QStyleOptionHeader::End;
    else
        opt.position = QStyleOptionHeader::Middle;
    opt.orientation = orientation();
    // the selected position
    bool previousSelected = selectionModel()->columnIntersectsSelection(this->logicalIndex(visual - 1), rootIndex());
    bool nextSelected =  selectionModel()->columnIntersectsSelection(this->logicalIndex(visual + 1), rootIndex());
    if (previousSelected && nextSelected)
        opt.selectedPosition = QStyleOptionHeader::NextAndPreviousAreSelected;
    else if (previousSelected)
        opt.selectedPosition = QStyleOptionHeader::PreviousIsSelected;
    else if (nextSelected)
        opt.selectedPosition = QStyleOptionHeader::NextIsSelected;
    else
        opt.selectedPosition = QStyleOptionHeader::NotAdjacent;
    // draw the section
    style()->drawControl(QStyle::CE_Header, &opt, painter, this);

    painter->setBrushOrigin(oldBO);
  } else
    QHeaderView::paintSection(painter, rect, logicalIndex);
}

void QtHeaderView::setModel(QAbstractItemModel* model)
{
  Q_D(QtHeaderView);
  d->model = model;
  clearSortIndicators();

  QHeaderView::setModel(model);
}

void QtHeaderView::showAllColumns()
{
  for (int i = 0; i < count(); ++i)
    setSectionHidden(i, false);
}

void QtHeaderView::hideColumnAction()
{
  Q_D(QtHeaderView);
  hideSection(d->currentLogicalIndex);
}

void QtHeaderView::sortAscAction()
{
  Q_D(QtHeaderView);
  if (d->sortFlag == NoSort)
    return;

  if ((d->sortFlag == MultiSort)) {
    setSortIndicator(d->currentLogicalIndex, Qt::AscendingOrder);
  } else {
    d->clearSortIndicatorsWithoutRepaint();
    setSortIndicator(d->currentLogicalIndex, Qt::AscendingOrder);
  }

  emit sortIndicatorsChanged();
}

void QtHeaderView::sortDescAction()
{
  Q_D(QtHeaderView);
  if (d->sortFlag == NoSort)
    return;

  if ((d->sortFlag == MultiSort)) {
    setSortIndicator(d->currentLogicalIndex, Qt::DescendingOrder);
  } else {
    d->clearSortIndicatorsWithoutRepaint();
    setSortIndicator(d->currentLogicalIndex, Qt::DescendingOrder);
  }
  emit sortIndicatorsChanged();
}

void QtHeaderView::removeSortAction()
{
  Q_D(QtHeaderView);
  if (d->sortFlag == NoSort)
    return;

  if (d->sortingColumns.contains(d->currentLogicalIndex)) {
    removeSortIndicator(d->currentLogicalIndex);
    emit sortIndicatorsChanged();
  }
}

void QtHeaderView::mousePressEvent(QMouseEvent *event)
{
  Q_D(QtHeaderView);

  // Remember section for hide|show|sortAsc|sortDesc|removeSort Actions
  d->currentLogicalIndex = logicalIndexAt(event->pos());

  // genereate sectionClicked()
  // QTableView select column.
  QHeaderView::mousePressEvent(event);
}

void QtHeaderView::mouseReleaseEvent(QMouseEvent *event)
{
  Q_D(QtHeaderView);

  int currentLogicalIndex = logicalIndexAt(event->pos());
  if (currentLogicalIndex != -1) {
    // Можно сортировать
    if (d->sortFlag != NoSort) {
      // If multisort and ctrl pressed
      // Если можно сортировать по нескольким столбцам и зажат контрол
      if ((d->sortFlag == MultiSort) && (QApplication::keyboardModifiers() & Qt::ControlModifier)
        && (QApplication::keyboardModifiers() & Qt::ShiftModifier)) {
        if (sortIndicatorOrder(currentLogicalIndex) == Qt::DescendingOrder) {
          d->removeSortIndicatorWithoutRepaint(currentLogicalIndex);
        } else if (!isSortIndicatorShown(currentLogicalIndex)) {
          setSortIndicator(currentLogicalIndex, Qt::AscendingOrder);
        } else {
          setSortIndicator(currentLogicalIndex, Qt::DescendingOrder);
        }
        emit sortIndicatorsChanged();
        // Нужно соритровать по одному столбцу
      } else if ((QApplication::keyboardModifiers() & Qt::ShiftModifier)) {
        if (isSortIndicatorShown(currentLogicalIndex)) {
          if (sortIndicatorOrder(currentLogicalIndex) == Qt::DescendingOrder) {
            d->clearSortIndicatorsWithoutRepaint();
          } else {
            if (sortIndicatorSections().count()) {
              d->clearSortIndicatorsWithoutRepaint();
            }
            setSortIndicator(currentLogicalIndex, Qt::DescendingOrder);
          }
        } else {
          if (sortIndicatorSections().count()) {
            d->clearSortIndicatorsWithoutRepaint();
          }
          setSortIndicator(currentLogicalIndex, Qt::AscendingOrder);
        }
        emit sortIndicatorsChanged();
      }
    }
  }

  QHeaderView::mouseReleaseEvent(event);
}

void QtHeaderView::mouseDoubleClickEvent(QMouseEvent *event)
{
  Q_D(QtHeaderView);
  int currentLogicalIndex = logicalIndexAt(event->pos());
  sectionSize(currentLogicalIndex);
  if (currentLogicalIndex != -1) {
    bool ok;
    QString text = QInputDialog::getText(this, tr("Enter string"), tr("New name for column:"),
                                         QLineEdit::Normal,
                                         model()->headerData(currentLogicalIndex, orientation()
                                                             , Qt::EditRole).toString()
                                         , &ok);
    if(ok && !text.isEmpty())
      d->model->setHeaderData(currentLogicalIndex, orientation(), text, Qt::EditRole);
  }

  QHeaderView::mouseDoubleClickEvent(event);
}

void QtHeaderView::showHideActionToggled(bool checked)
{
  Q_D(QtHeaderView);
  QAction *senderAction = qobject_cast<QAction *> (sender());
  if (senderAction)
    setSectionHidden(d->showhideColumnActionList.indexOf(senderAction), !checked);
}

void QtHeaderView::showHideMenuAboutToShow()
{
  Q_D(QtHeaderView);

  foreach (QAction *action, d->showhideColumnActionList) {
    disconnect(action, SIGNAL(toggled(bool))
               , this, SLOT(showHideActionToggled(bool)));
  }
  qDeleteAll(d->showhideColumnActionList);
  d->showhideColumnActionList.clear();

  QAction *inserting;
  for (int i = 0; i < count(); ++i) {
    inserting = new QAction(d->model->headerData(i, orientation(), Qt::DisplayRole).toString(), this);
    inserting->setCheckable(true);
    inserting->setChecked(!isSectionHidden(i));
    inserting->setToolTip(d->model->headerData(i, orientation(), Qt::ToolTipRole).toString());
    inserting->setIcon(d->model->headerData(i, orientation(), Qt::DecorationRole).value<QIcon>());
    inserting->setStatusTip(d->model->headerData(i, orientation(), Qt::StatusTipRole).toString());
    inserting->setWhatsThis(d->model->headerData(i, orientation(), Qt::WhatsThisRole).toString());
    inserting->setFont(d->model->headerData(i, orientation(), Qt::FontRole).value<QFont>());

    d->showhideColumnActionList.append(inserting);
    connect(inserting, SIGNAL(toggled(bool)),
            this, SLOT(showHideActionToggled(bool)));
  }
  checkOneColumn();
  d->showHideColumnsMenu->addActions(d->showhideColumnActionList);
}

void QtHeaderView::checkOneColumn()
{
  Q_D(QtHeaderView);
  if (hiddenSectionCount() + 1 == d->showhideColumnActionList.count())
    for (int i = 0; i < d->showhideColumnActionList.count(); ++i)
      if (d->showhideColumnActionList.value(i)->isChecked()) {
    d->showhideColumnActionList.value(i)->setEnabled(false);
    break;
  }
}

void QtHeaderView::contextMenuEvent(QContextMenuEvent *event)
{
  Q_D(QtHeaderView);

  d->movableAction->setChecked(isMovable());
  d->hightlightAction->setChecked(highlightSections());

  d->hideColumnAction->setEnabled(d->currentLogicalIndex!=-1);
  if (hiddenSectionCount() + 1 == d->showhideColumnActionList.count()) {
    d->hideColumnAction->setEnabled(false);
  } else {
    d->hideColumnAction->setEnabled(d->currentLogicalIndex!=-1);
  }
  d->showAllColumnsAction->setEnabled(hiddenSectionCount());

  if (d->sortingColumns.contains(d->currentLogicalIndex)) {
    d->removeSortAction->setEnabled(true);
    if (d->sortingColumns.value(d->currentLogicalIndex) == Qt::AscendingOrder) {
      d->sortDescAction->setEnabled(true);
      d->sortAscAction->setEnabled(false);
    } else {
      d->sortDescAction->setEnabled(false);
      d->sortAscAction->setEnabled(true);
    }
  } else if (d->currentLogicalIndex != -1) {
    d->removeSortAction->setEnabled(false);
    d->sortDescAction->setEnabled(true);
    d->sortAscAction->setEnabled(true);
  } else {
    d->removeSortAction->setEnabled(false);
    d->sortDescAction->setEnabled(false);
    d->sortAscAction->setEnabled(false);
  }

  QMenu *menu = new QMenu(this);
  menu->addActions(actions());
  menu->exec(event->globalPos());
}


// disabling method
Qt::SortOrder QtHeaderView::sortIndicatorOrder() const
{
  return Qt::AscendingOrder;
}
int QtHeaderView::sortIndicatorSection() const
{
  return 0;
}

void QtHeaderView::setMovableTriggered(bool movable)
{
  QHeaderView::setMovable(movable);
}

void QtHeaderView::setHighlightSectionsTriggered(bool highlight)
{
  QHeaderView::setHighlightSections(highlight);
}
Записан
asvil
Гость
« Ответ #8 : Май 27, 2010, 20:27 »


private/qtheaderview_p.h
Код:
#ifndef QTHEADERVIEW_P_H
#define QTHEADERVIEW_P_H

#include "qtheaderview.h"

class QAction;
class QtHeaderViewPrivate {
  Q_DECLARE_PUBLIC(QtHeaderView);
public:
  QtHeaderViewPrivate(){};
  virtual ~QtHeaderViewPrivate(){};

  QAbstractItemModel *model;
  QtHeaderView::SortFlag sortFlag;
  QHash<int, Qt::SortOrder > sortingColumns; //< section, SortOrder>
  QList<int> orderList;
  QtHeaderView * q_ptr;

  QAction *hideColumnAction;
  QAction *showAllColumnsAction;

  QAction *showHideSeparator;
  QAction *showhideColumnActionMenu;
  QMenu *showHideColumnsMenu;
  QList<QAction *> showhideColumnActionList;

  QAction *sortSeparator;
  QAction *sortAscAction;
  QAction *sortDescAction;
  QAction *removeSortAction;

  QAction *movableAction;
  QAction *hightlightAction;

  int currentLogicalIndex;

  void clearSortIndicatorsWithoutRepaint()
  {
    sortingColumns.clear();
    orderList.clear();
  }

  void removeSortIndicatorWithoutRepaint(int logicalIndex)
  {
    sortingColumns.remove(logicalIndex);
    orderList.removeAll(logicalIndex);
  }

  inline bool rowIntersectsSelection(int row) const {
      return (q_ptr->selectionModel() ? q_ptr->selectionModel()->rowIntersectsSelection(row, q_ptr->rootIndex()) : false);
  }

  inline bool columnIntersectsSelection(int column) const {
      return (q_ptr->selectionModel() ? q_ptr->selectionModel()->columnIntersectsSelection(column, q_ptr->rootIndex()) : false);
  }

  inline bool sectionIntersectsSelection(int logical) const {
      return (q_ptr->orientation() == Qt::Horizontal ? columnIntersectsSelection(logical) : rowIntersectsSelection(logical));
  }

  inline bool isRowSelected(int row) const {
      return (q_ptr->selectionModel() ? q_ptr->selectionModel()->isRowSelected(row, q_ptr->rootIndex()) : false);
  }

  inline bool isColumnSelected(int column) const {
      return (q_ptr->selectionModel() ? q_ptr->selectionModel()->isColumnSelected(column, q_ptr->rootIndex()) : false);
  }
};


#endif // HEADERVIEW_P_H

Записан
eJinn
Гость
« Ответ #9 : Август 05, 2013, 06:05 »

private/qtheaderview_p.h

Не понял. Где должен лежать этот файл? Зачем для него подпапка private?
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #10 : Август 05, 2013, 10:42 »

потому что
Danger! PIMPL using.
но можешь приватный файл qtheaderview_p.h поместить рядом с остальными — тогда в инклуде удали private/
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
eJinn
Гость
« Ответ #11 : Август 05, 2013, 16:56 »

потому что
Danger! PIMPL using.
но можешь приватный файл qtheaderview_p.h поместить рядом с остальными — тогда в инклуде удали private/
OK, почитал про PIMPL.
Изначально я подумал(и испугался Улыбающийся), что этот файл должен замещать собой стандартный qheaderview_p.h. А нынче, в Qt 5.0 он существенно больше, чем у Михаила. Времени-то много утекло с его разработки.
« Последнее редактирование: Август 05, 2013, 17:40 от eJinn » Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.137 секунд. Запросов: 23.