⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 qtablewidget.cpp

📁 奇趣公司比较新的qt/emd版本
💻 CPP
📖 第 1 页 / 共 5 页
字号:
    view->setItem(index.row(), index.column(), itm);    return true;}Qt::ItemFlags QTableModel::flags(const QModelIndex &index) const{    if (!index.isValid())        return Qt::ItemIsDropEnabled;    if (QTableWidgetItem *itm = item(index))        return itm->flags();    return (Qt::ItemIsEditable            |Qt::ItemIsSelectable            |Qt::ItemIsUserCheckable            |Qt::ItemIsEnabled            |Qt::ItemIsDragEnabled            |Qt::ItemIsDropEnabled);}void QTableModel::sort(int column, Qt::SortOrder order){    QVector<QPair<QTableWidgetItem*, int> > sortable;    QVector<int> unsortable;    sortable.reserve(rowCount());    unsortable.reserve(rowCount());    for (int row = 0; row < rowCount(); ++row) {        if (QTableWidgetItem *itm = item(row, column))            sortable.append(QPair<QTableWidgetItem*,int>(itm, row));        else            unsortable.append(row);    }    LessThan compare = (order == Qt::AscendingOrder ? &itemLessThan : &itemGreaterThan);    qStableSort(sortable.begin(), sortable.end(), compare);    QVector<QTableWidgetItem*> sorted_table(tableItems.count());    QModelIndexList from;    QModelIndexList to;    for (int i = 0; i < rowCount(); ++i) {        int r = (i < sortable.count()                 ? sortable.at(i).second                 : unsortable.at(i - sortable.count()));        for (int c = 0; c < columnCount(); ++c) {            sorted_table[tableIndex(i, c)] = item(r, c);            from.append(createIndex(r, c, 0));            to.append(createIndex(i, c, 0));        }    }    emit layoutAboutToBeChanged();    tableItems = sorted_table;    changePersistentIndexList(from, to); // ### slow    emit layoutChanged();}bool QTableModel::canConvertToDouble(const QVariant &value){    switch (value.type()) {    case QVariant::Bool:    case QVariant::Int:    case QVariant::UInt:    case QVariant::LongLong:    case QVariant::ULongLong:    case QVariant::Double:    case QVariant::Char:        return true;    default:        return false;    }    return false;}/*  \internal  Ensures that rows in the interval [start, end] are  sorted according to the contents of column \a column  and the given sort \a order.*/void QTableModel::ensureSorted(int column, Qt::SortOrder order,                               int start, int end){    int count = end - start + 1;    QVector < QPair<QTableWidgetItem*,int> > sorting;    sorting.reserve(count);    for (int row = start; row <= end; ++row) {        QTableWidgetItem *itm = item(row, column);        if (itm == 0) {            // no more sortable items (all 0-items are            // at the end of the table when it is sorted)            break;        }        sorting.append(QPair<QTableWidgetItem*,int>(itm, row));    }    LessThan compare = (order == Qt::AscendingOrder ? &itemLessThan : &itemGreaterThan);    qStableSort(sorting.begin(), sorting.end(), compare);    QModelIndexList oldPersistentIndexes = persistentIndexList();    QModelIndexList newPersistentIndexes = oldPersistentIndexes;    QVector<QTableWidgetItem*> newTable = tableItems;    QVector<QTableWidgetItem*> newVertical = verticalHeaderItems;    QVector<QTableWidgetItem*> colItems = columnItems(column);    QVector<QTableWidgetItem*>::iterator vit = colItems.begin();    bool changed = false;    for (int i = 0; i < sorting.count(); ++i) {        int oldRow = sorting.at(i).second;        QTableWidgetItem *item = colItems.at(oldRow);        colItems.remove(oldRow);        vit = sortedInsertionIterator(vit, colItems.end(), order, item);        int newRow = qMax((int)(vit - colItems.begin()), 0);        vit = colItems.insert(vit, item);        if (newRow != oldRow) {            changed = true;            // move the items @ oldRow to newRow            int cc = columnCount();            QVector<QTableWidgetItem*> rowItems(cc);            for (int j = 0; j < cc; ++j)                rowItems[j] = newTable.at(tableIndex(oldRow, j));            newTable.remove(tableIndex(oldRow, 0), cc);            newTable.insert(tableIndex(newRow, 0), cc, 0);            for (int j = 0; j < cc; ++j)                newTable[tableIndex(newRow, j)] = rowItems.at(j);            QTableWidgetItem *header = newVertical.at(oldRow);            newVertical.remove(oldRow);            newVertical.insert(newRow, header);            // update persistent indexes            updateRowIndexes(newPersistentIndexes, oldRow, newRow);            // the index of the remaining rows may have changed            for (int j = i + 1; j < sorting.count(); ++j) {                int otherRow = sorting.at(j).second;                if (oldRow < otherRow && newRow >= otherRow)                    --sorting[j].second;                else if (oldRow > otherRow && newRow <= otherRow)                    ++sorting[j].second;            }        }    }    if (changed) {        emit layoutAboutToBeChanged();        tableItems = newTable;        verticalHeaderItems = newVertical;        changePersistentIndexList(oldPersistentIndexes,                                  newPersistentIndexes);        emit layoutChanged();    }}/*  \internal  Returns the non-0 items in column \a column.*/QVector<QTableWidgetItem*> QTableModel::columnItems(int column) const{    QVector<QTableWidgetItem*> items;    int rc = rowCount();    items.reserve(rc);    for (int row = 0; row < rc; ++row) {        QTableWidgetItem *itm = item(row, column);        if (itm == 0) {            // no more sortable items (all 0-items are            // at the end of the table when it is sorted)            break;        }        items.append(itm);    }    return items;}/*  \internal  Adjusts the row of each index in \a indexes if necessary, given  that a row of items has been moved from row \a movedFrom to row  \a movedTo.*/void QTableModel::updateRowIndexes(QModelIndexList &indexes,                                   int movedFromRow, int movedToRow){    QModelIndexList::iterator it;    for (it = indexes.begin(); it != indexes.end(); ++it) {        int oldRow = (*it).row();        int newRow = oldRow;        if (oldRow == movedFromRow)            newRow = movedToRow;        else if (movedFromRow < oldRow && movedToRow >= oldRow)            newRow = oldRow - 1;        else if (movedFromRow > oldRow && movedToRow <= oldRow)            newRow = oldRow + 1;        if (newRow != oldRow)            *it = index(newRow, (*it).column(), (*it).parent());    }}/*  \internal  Returns an iterator to the item where \a item should be  inserted in the interval (\a begin, \a end) according to  the given sort \a order.*/QVector<QTableWidgetItem*>::iterator QTableModel::sortedInsertionIterator(    const QVector<QTableWidgetItem*>::iterator &begin,    const QVector<QTableWidgetItem*>::iterator &end,    Qt::SortOrder order, QTableWidgetItem *item){    if (order == Qt::AscendingOrder)        return qLowerBound(begin, end, item, QTableModelLessThan());    return qLowerBound(begin, end, item, QTableModelGreaterThan());}bool QTableModel::itemLessThan(const QPair<QTableWidgetItem*,int> &left,                               const QPair<QTableWidgetItem*,int> &right){    return *(left.first) < *(right.first);}bool QTableModel::itemGreaterThan(const QPair<QTableWidgetItem*,int> &left,                                  const QPair<QTableWidgetItem*,int> &right){    return (*(right.first) < *(left .first));}QVariant QTableModel::headerData(int section, Qt::Orientation orientation, int role) const{    if (section < 0)        return QVariant();    QTableWidgetItem *itm = 0;    if (orientation == Qt::Horizontal && section < horizontalHeaderItems.count())        itm = horizontalHeaderItems.at(section);    else if (orientation == Qt::Vertical && section < verticalHeaderItems.count())        itm = verticalHeaderItems.at(section);    else        return QVariant(); // section is out of bounds    if (itm)        return itm->data(role);    if (role == Qt::DisplayRole)        return section + 1;    return QVariant();}bool QTableModel::setHeaderData(int section, Qt::Orientation orientation,                                const QVariant &value, int role){    if (section < 0 ||       (orientation == Qt::Horizontal && horizontalHeaderItems.size() <= section) ||       (orientation == Qt::Vertical && verticalHeaderItems.size() <= section))    return false;    QTableWidgetItem *itm = 0;    if (orientation == Qt::Horizontal)        itm = horizontalHeaderItems.at(section);    else        itm = verticalHeaderItems.at(section);    if (itm) {        itm->setData(role, value);        return true;    }    return false;}bool QTableModel::isValid(const QModelIndex &index) const{    return (index.isValid()            && index.row() < verticalHeaderItems.count()            && index.column() < horizontalHeaderItems.count());}void QTableModel::clear(){    for (int j = 0; j < verticalHeaderItems.count(); ++j) {        if (verticalHeaderItems.at(j)) {            verticalHeaderItems.at(j)->view = 0;            delete verticalHeaderItems.at(j);            verticalHeaderItems[j] = 0;        }    }    for (int k = 0; k < horizontalHeaderItems.count(); ++k) {        if (horizontalHeaderItems.at(k)) {            horizontalHeaderItems.at(k)->view = 0;            delete horizontalHeaderItems.at(k);            horizontalHeaderItems[k] = 0;        }    }    clearContents();}void QTableModel::clearContents(){    for (int i = 0; i < tableItems.count(); ++i) {        if (tableItems.at(i)) {            tableItems.at(i)->view = 0;            delete tableItems.at(i);            tableItems[i] = 0;        }    }    reset();}void QTableModel::itemChanged(QTableWidgetItem *item){    if (!item)        return;    if (item->flags() & ItemIsHeaderItem) {        int row = verticalHeaderItems.indexOf(item);        if (row >= 0) {            emit headerDataChanged(Qt::Vertical, row, row);        } else {            int column = horizontalHeaderItems.indexOf(item);            if (column >= 0)                emit headerDataChanged(Qt::Horizontal, column, column);        }    } else {        QModelIndex idx = index(item);        if (idx.isValid())            emit dataChanged(idx, idx);    }}QTableWidgetItem* QTableModel::createItem() const{    return prototype ? prototype->clone() : new QTableWidgetItem;}const QTableWidgetItem *QTableModel::itemPrototype() const{    return prototype;}void QTableModel::setItemPrototype(const QTableWidgetItem *item){    if (prototype != item) {        delete prototype;        prototype = item;    }}QStringList QTableModel::mimeTypes() const{    const QTableWidget *view = ::qobject_cast<const QTableWidget*>(QObject::parent());    return (view ? view->mimeTypes() : QStringList());}QMimeData *QTableModel::internalMimeData()  const{    return QAbstractTableModel::mimeData(cachedIndexes);}QMimeData *QTableModel::mimeData(const QModelIndexList &indexes) const{    QList<QTableWidgetItem*> items;    for (int i = 0; i < indexes.count(); ++i)        items << item(indexes.at(i));    const QTableWidget *view = ::qobject_cast<const QTableWidget*>(QObject::parent());    // cachedIndexes is a little hack to avoid copying from QModelIndexList to    // QList<QTreeWidgetItem*> and back again in the view    cachedIndexes = indexes;    QMimeData *mimeData = (view ? view->mimeData(items) : 0);    cachedIndexes.clear();    return mimeData;}bool QTableModel::dropMimeData(const QMimeData *data, Qt::DropAction action,                              int row , int column, const QModelIndex &index){    if (index.isValid()) {        row = index.row();        column = index.column();    }else if (row == -1 || column == -1) {  // The user dropped outside the table.        row = rowCount();        column = 0;    }    QTableWidget *view = ::qobject_cast<QTableWidget*>(QObject::parent());    return (view ? view->dropMimeData(row, column, data, action) : false);}Qt::DropActions QTableModel::supportedDropActions() const{    const QTableWidget *view = ::qobject_cast<const QTableWidget*>(QObject::parent());    return (view ? view->supportedDropActions() : Qt::DropActions(Qt::IgnoreAction));}/*!    \class QTableWidgetSelectionRange    \brief The QTableWidgetSelectionRange class provides a container for    storing a selection range in a QTableWidget.    \ingroup model-view    The QTableWidgetSelectionRange class stores the top left and bottom    right rows and columns of a selection range in a table. The    selections in the table may consist of several selection ranges.    \sa QTableWidget*//*!    Constructs an table selection range, i.e. a range    whose rowCount() and columnCount() are 0.*/QTableWidgetSelectionRange::QTableWidgetSelectionRange()    : top(-1), left(-1), bottom(-2), right(-2){}/*!    Constructs the table selection range from the given \a top, \a    left, \a bottom and \a right table rows and columns.    \sa topRow(), leftColumn(), bottomRow(), rightColumn()*/QTableWidgetSelectionRange::QTableWidgetSelectionRange(int top, int left, int bottom, int right)    : top(top), left(left), bottom(bottom), right(right){}/*!    Constructs a the table selection range by copying the given \a    other table selection range.*/QTableWidgetSelectionRange::QTableWidgetSelectionRange(const QTableWidgetSelectionRange &other)    : top(other.top), left(other.left), bottom(other.bottom), right(other.right){}/*!    Destroys the table selection range.*/QTableWidgetSelectionRange::~QTableWidgetSelectionRange(){}/*!    \fn int QTableWidgetSelectionRange::topRow() const    Returns the top row of the range.    \sa bottomRow(), leftColumn(), rowCount()*//*!    \fn int QTableWidgetSelectionRange::bottomRow() const    Returns the bottom row of the range.    \sa topRow(), rightColumn(), rowCount()*//*!    \fn int QTableWidgetSelectionRange::leftColumn() const    Returns the left column of the range.    \sa rightColumn(), topRow(), columnCount()*/

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -