📄 complexwidgets.cpp
字号:
QModelIndex idx = child ? childIndex(child) : QModelIndex(row); if (!idx.isValid()) return false; QItemSelectionModel::SelectionFlags command = QItemSelectionModel::NoUpdate; switch (action) { case SetFocus: view->setCurrentIndex(idx); return true; case ExtendSelection: if (!child) return false; view->selectionModel()->select(QItemSelection(view->currentIndex(), idx), QItemSelectionModel::SelectCurrent); return true; case Select: command = QItemSelectionModel::ClearAndSelect; break; case ClearSelection: command = QItemSelectionModel::Clear; break; case RemoveSelection: command = QItemSelectionModel::Deselect; break; case AddToSelection: command = QItemSelectionModel::SelectCurrent; break; } if (command == QItemSelectionModel::NoUpdate) return false; if (child) view->selectionModel()->select(idx, command); else view->selectionModel()->select(rowAt(row), command); return true;}class ModelIndexIterator{public: ModelIndexIterator(QAbstractItemView *view, const QModelIndex &start = QModelIndex()) : m_view(view) { if (start.isValid()) { m_current = start; } else if (m_view && m_view->model()) { m_current = view->model()->index(0, 0); } } bool next(int count = 1) { for (int i = 0; i < count; ++i) { do { if (m_current.isValid()) { const QAbstractItemModel *m = m_current.model();#ifndef QT_NO_TREEVIEW QTreeView *tree = qobject_cast<QTreeView*>(m_view); if (m_current.model()->hasChildren(m_current) && tree && tree->isExpanded(m_current)) { m_current = m_current.child(0, 0); } else#endif { int row = m_current.row(); QModelIndex par = m_current.parent(); while (row == m->rowCount(par) - 1) { m_current = par; row = m_current.row(); par = m_current.parent(); } if (m_current.isValid()) m_current = m_current.sibling(row + 1, 0); } } } while (isHidden()); } return m_current.isValid(); } bool isHidden() const { if (false) {#ifndef QT_NO_LISTVIEW } else if (const QListView *list = qobject_cast<const QListView*>(m_view)) { return list->isRowHidden(m_current.row());#endif#ifndef QT_NO_TREEVIEW } else if (const QTreeView *tree = qobject_cast<const QTreeView*>(m_view)) { return tree->isRowHidden(m_current.row(), m_current.parent());#endif#ifndef QT_NO_TABLEVIEW } else if (const QTableView *table = qobject_cast<const QTableView*>(m_view)) { return table->isRowHidden(m_current.row());#endif } return false; } QModelIndex current() const { return m_current; }private: QModelIndex m_current; QAbstractItemView *m_view;};QAccessibleItemView::QAccessibleItemView(QWidget *w) : QAccessibleAbstractScrollArea(w->objectName() == QLatin1String("qt_scrollarea_viewport") ? w->parentWidget() : w){ atVP = w->objectName() == QLatin1String("qt_scrollarea_viewport");}QAccessible::Role QAccessibleItemView::expectedRoleOfChildren() const{ if (atViewport()) { if (false) {#ifndef QT_NO_TREEVIEW } else if (qobject_cast<const QTreeView*>(itemView())) { return TreeItem;#endif#ifndef QT_NO_LISTVIEW } else if (qobject_cast<const QListView*>(itemView())) { return ListItem;#endif } // TableView return Row; } else { if (false) {#ifndef QT_NO_TREEVIEW } else if (qobject_cast<const QTreeView*>(itemView())) { return Tree;#endif#ifndef QT_NO_LISTVIEW } else if (qobject_cast<const QListView*>(itemView())) { return List;#endif } // TableView return Table; }}QObject *QAccessibleItemView::object() const{ QObject *view = QAccessibleAbstractScrollArea::object(); Q_ASSERT(qobject_cast<const QAbstractItemView *>(view)); if (atViewport()) view = qobject_cast<const QAbstractItemView *>(view)->viewport(); return view;}QAbstractItemView *QAccessibleItemView::itemView() const{ return qobject_cast<QAbstractItemView *>(QAccessibleAbstractScrollArea::object());}int QAccessibleItemView::indexOfChild(const QAccessibleInterface *iface) const{ if (atViewport()) { if (!iface || iface->role(0) != expectedRoleOfChildren()) return -1; // ### This will fail if a row is hidden. QModelIndex idx = static_cast<const QAccessibleItemRow *>(iface)->row; if (!idx.isValid()) return -1; return entryFromIndex(idx); } else { return QAccessibleAbstractScrollArea::indexOfChild(iface); }}QModelIndex QAccessibleItemView::childIndex(int child) const{ if (!atViewport()) return QModelIndex(); ModelIndexIterator it(itemView()); it.next(child - 1); return it.current();}int QAccessibleItemView::entryFromIndex(const QModelIndex &index) const{ int entry = -1; if (false) {#ifndef QT_NO_TREEVIEW } else if (QTreeView *tree = qobject_cast<QTreeView*>(itemView())) { entry = tree->visualIndex(index) + 1;#endif#ifndef QT_NO_LISTVIEW } else if (QListView *list = qobject_cast<QListView*>(itemView())) { entry = list->visualIndex(index) + 1;#endif#ifndef QT_NO_TABLEVIEW } else if (QTableView *table = qobject_cast<QTableView*>(itemView())) { entry = table->visualIndex(index) + 1;#endif } return entry;}int QAccessibleItemView::childCount() const{ if (atViewport()) { if (itemView()->model() == 0) return 0; QAbstractItemModel *m = itemView()->model(); QModelIndex idx = m->index(0,0); if (!idx.isValid()) return 0; ModelIndexIterator it(itemView()); int count = 1; while (it.next()) { ++count; } return count; } else { return QAccessibleAbstractScrollArea::childCount(); }}QString QAccessibleItemView::text(Text t, int child) const{ if (atViewport()) { if (!child) return QAccessibleAbstractScrollArea::text(t, child); QAccessibleItemRow item(itemView(), childIndex(child)); return item.text(t, 1); } else { return QAccessibleAbstractScrollArea::text(t, child); }}void QAccessibleItemView::setText(Text t, int child, const QString &text){ if (atViewport()) { if (!child) { QAccessibleAbstractScrollArea::setText(t, child, text); return; } QAccessibleItemRow item(itemView(), childIndex(child)); item.setText(t, 1, text); } else { QAccessibleAbstractScrollArea::setText(t, child, text); }}QRect QAccessibleItemView::rect(int child) const{ if (atViewport()) { QRect r; if (!child) { QWidget *w = itemView()->viewport(); QPoint globalPos = w->mapToGlobal(QPoint(0,0)); r = w->rect().translated(globalPos); } else { QModelIndex idx = childIndex(child); QAccessibleInterface *iface = new QAccessibleItemRow(itemView(), idx); r = iface->rect(0); delete iface; } return r; } else { return QAccessibleAbstractScrollArea::rect(child); }}int QAccessibleItemView::childAt(int x, int y) const{ if (atViewport()) { QPoint localPos = itemView()->viewport()->mapFromGlobal(QPoint(x, y)); QModelIndex idx = itemView()->indexAt(localPos); idx = idx.sibling(idx.row(), 0); int entry = entryFromIndex(idx); if (entry == -1 && rect(0).contains(QPoint(x,y))) entry = 0; return entry; } else { return QAccessibleAbstractScrollArea::childAt(x, y); }}QAccessible::Role QAccessibleItemView::role(int child) const{ if ((!atViewport() && child) || (atViewport() && child == 0)) { QAbstractItemView *view = itemView();#ifndef QT_NO_TABLEVIEW if (qobject_cast<QTableView *>(view)) return Table;#endif#ifndef QT_NO_LISTVIEW if (qobject_cast<QListView *>(view)) return List;#endif return Tree; } if (atViewport()) { if (child) return Row; } return QAccessibleAbstractScrollArea::role(child);}QAccessible::State QAccessibleItemView::state(int child) const{ State st = Normal; bool queryViewPort = (atViewport() && child == 0) || (!atViewport() && child == 1); if (queryViewPort) { if (itemView()->selectionMode() != QAbstractItemView::NoSelection) { st |= Selectable; st |= Focusable; } } else if (atViewport()) { // children of viewport QAccessibleItemRow item(itemView(), childIndex(child)); st |= item.state(0); } else if (!atViewport() && child != 1) { st = QAccessibleAbstractScrollArea::state(child); } return st;}int QAccessibleItemView::navigate(RelationFlag relation, int index, QAccessibleInterface **iface) const{ if (atViewport()) { if (relation == Ancestor && index == 1) { *iface = new QAccessibleItemView(itemView()); return 0; } else if (relation == Child && index >= 1) { //###JAS hidden rows.. QModelIndex idx = childIndex(index); if (idx.isValid()) { *iface = new QAccessibleItemRow(itemView(), idx); return 0; } } else if (relation == Sibling && index >= 1) { QAccessibleInterface *parent = new QAccessibleItemView(itemView()); return parent->navigate(Child, index, iface); } *iface = 0; return -1; } else { return QAccessibleAbstractScrollArea::navigate(relation, index, iface); }}/* returns the model index for a given row and column */QModelIndex QAccessibleItemView::index(int row, int column) const{ return itemView()->model()->index(row, column);}QAccessibleInterface *QAccessibleItemView::accessibleAt(int row, int column){ QWidget *indexWidget = itemView()->indexWidget(index(row, column)); return QAccessible::queryAccessibleInterface(indexWidget);}/* We don't have a concept of a "caption" in Qt's standard widgets */QAccessibleInterface *QAccessibleItemView::caption(){ return 0;}/* childIndex is row * columnCount + columnIndex */int QAccessibleItemView::childIndex(int rowIndex, int columnIndex){ return rowIndex * itemView()->model()->columnCount() + columnIndex;}/* Return the header data as column description */QString QAccessibleItemView::columnDescription(int column){ return itemView()->model()->headerData(column, Qt::Horizontal).toString();}/* We don't support column spanning atm */int QAccessibleItemView::columnSpan(int /* row */, int /* column */){ return 1;}/* Return the horizontal header view */QAccessibleInterface *QAccessibleItemView::columnHeader(){#ifndef QT_NO_TREEVIEW if (QTreeView *tree = qobject_cast<QTreeView *>(itemView())) return QAccessible::queryAccessibleInterface(tree->header());#endif#ifndef QT_NO_TABLEVIEW if (QTableView *table = qobject_cast<QTableView *>(itemView())) return QAccessible::queryAccessibleInterface(table->horizontalHeader());#endif return 0;}int QAccessibleItemView::columnIndex(int childIndex){ int columnCount = itemView()->model()->columnCount(); if (!columnCount) return 0; return childIndex % columnCount;}int QAccessibleItemView::columnCount(){ return itemView()->model()->columnCount();}int QAccessibleItemView::rowCount(){ return itemView()->model()->rowCount();}int QAccessibleItemView::selectedColumnCount(){ return itemView()->selectionModel()->selectedColumns().count();}int QAccessibleItemView::selectedRowCount(){ return itemView()->selectionModel()->selectedRows().count();}QString QAccessibleItemView::rowDescription(int row){ return itemView()->model()->headerData(row, Qt::Vertical).toString();}/* We don't support row spanning */int QAccessibleItemView::rowSpan(int /*row*/, int /*column*/){ return 1;}QAccessibleInterface *QAccessibleItemView::rowHeader(){#ifndef QT_NO_TABLEVIEW if (QTableView *table = qobject_cast<QTableView *>(itemView())) return QAccessible::queryAccessibleInterface(table->verticalHeader());#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -