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

📄 qtablewidget.cpp

📁 奇趣公司比较新的qt/emd版本
💻 CPP
📖 第 1 页 / 共 5 页
字号:
/******************************************************************************** Copyright (C) 1992-2007 Trolltech ASA. All rights reserved.**** This file is part of the QtGui module of the Qt Toolkit.**** This file may be used under the terms of the GNU General Public** License version 2.0 as published by the Free Software Foundation** and appearing in the file LICENSE.GPL included in the packaging of** this file.  Please review the following information to ensure GNU** General Public Licensing requirements will be met:** http://trolltech.com/products/qt/licenses/licensing/opensource/**** If you are unsure which license is appropriate for your use, please** review the following information:** http://trolltech.com/products/qt/licenses/licensing/licensingoverview** or contact the sales department at sales@trolltech.com.**** In addition, as a special exception, Trolltech gives you certain** additional rights. These rights are described in the Trolltech GPL** Exception version 1.0, which can be found at** http://www.trolltech.com/products/qt/gplexception/ and in the file** GPL_EXCEPTION.txt in this package.**** In addition, as a special exception, Trolltech, as the sole copyright** holder for Qt Designer, grants users of the Qt/Eclipse Integration** plug-in the right for the Qt/Eclipse Integration to link to** functionality provided by Qt Designer and its related libraries.**** Trolltech reserves all rights not expressly granted herein.**** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.******************************************************************************/#include "qtablewidget.h"#ifndef QT_NO_TABLEWIDGET#include <qitemdelegate.h>#include <qpainter.h>#include <private/qtablewidget_p.h>QTableModel::QTableModel(int rows, int columns, QTableWidget *parent)    : QAbstractTableModel(parent),      prototype(0),      tableItems(rows * columns, 0),      verticalHeaderItems(rows, 0),      horizontalHeaderItems(columns, 0){}QTableModel::~QTableModel(){    clear();    delete prototype;}bool QTableModel::insertRows(int row, int count, const QModelIndex &){    if (count < 1 || row < 0 || row > verticalHeaderItems.count())        return false;    beginInsertRows(QModelIndex(), row, row + count - 1);    int rc = verticalHeaderItems.count();    int cc = horizontalHeaderItems.count();    verticalHeaderItems.insert(row, count, 0);    if (rc == 0)        tableItems.resize(cc * count);    else        tableItems.insert(tableIndex(row, 0), cc * count, 0);    endInsertRows();    return true;}bool QTableModel::insertColumns(int column, int count, const QModelIndex &){    if (count < 1 || column < 0 || column > horizontalHeaderItems.count())        return false;    beginInsertColumns(QModelIndex(), column, column + count - 1);    int rc = verticalHeaderItems.count();    int cc = horizontalHeaderItems.count();    horizontalHeaderItems.insert(column, count, 0);    if (cc == 0)        tableItems.resize(rc * count);    else        for (int row = 0; row < rc; ++row)            tableItems.insert(tableIndex(row, column), count, 0);    endInsertColumns();    return true;}bool QTableModel::removeRows(int row, int count, const QModelIndex &){    if (count < 1 || row < 0 || row + count > verticalHeaderItems.count())        return false;    beginRemoveRows(QModelIndex(), row, row + count - 1);    int i = tableIndex(row, 0);    int n = count * columnCount();    QTableWidgetItem *oldItem = 0;    for (int j = i; j < n + i; ++j) {        oldItem = tableItems.at(j);        if (oldItem)            oldItem->view = 0;        delete oldItem;    }    tableItems.remove(qMax(i, 0), n);    for (int v = row; v < row + count; ++v) {        oldItem = verticalHeaderItems.at(v);        if (oldItem)            oldItem->view = 0;        delete oldItem;    }    verticalHeaderItems.remove(row, count);    endRemoveRows();    return true;}bool QTableModel::removeColumns(int column, int count, const QModelIndex &){    if (count < 1 || column < 0 || column + count >  horizontalHeaderItems.count())        return false;    beginRemoveColumns(QModelIndex(), column, column + count - 1);    QTableWidgetItem *oldItem = 0;    for (int row = rowCount() - 1; row >= 0; --row) {        int i = tableIndex(row, column);        for (int j = i; j < i + count; ++j) {            oldItem = tableItems.at(j);            if (oldItem)                oldItem->view = 0;            delete oldItem;        }        tableItems.remove(i, count);    }    for (int h=column; h<column+count; ++h) {        oldItem = horizontalHeaderItems.at(h);        if (oldItem)            oldItem->view = 0;        delete oldItem;    }    horizontalHeaderItems.remove(column, count);    endRemoveColumns();    return true;}void QTableModel::setItem(int row, int column, QTableWidgetItem *item){    int i = tableIndex(row, column);    if (i < 0 || i >= tableItems.count())        return;    QTableWidgetItem *oldItem = tableItems.at(i);    if (item == oldItem)        return;    // remove old    if (oldItem)        oldItem->view = 0;    delete tableItems.at(i);    QTableWidget *view = qobject_cast<QTableWidget*>(QObject::parent());    // set new    if (item)        item->d->id = i;     tableItems[i] = item;    if (view && view->isSortingEnabled()        && view->horizontalHeader()->sortIndicatorSection() == column) {        // sorted insertion        Qt::SortOrder order = view->horizontalHeader()->sortIndicatorOrder();        QVector<QTableWidgetItem*> colItems = columnItems(column);        if (row < colItems.count())            colItems.remove(row);        int sortedRow;        if (item == 0) {            // move to after all non-0 (sortable) items            sortedRow = colItems.count();        } else {            QVector<QTableWidgetItem*>::iterator it;            it = sortedInsertionIterator(colItems.begin(), colItems.end(), order, item);            sortedRow = qMax((int)(it - colItems.begin()), 0);        }        if (sortedRow != row) {            emit layoutAboutToBeChanged();            // move the items @ row to sortedRow            int cc = columnCount();            QVector<QTableWidgetItem*> rowItems(cc);            for (int j = 0; j < cc; ++j)                rowItems[j] = tableItems.at(tableIndex(row, j));            tableItems.remove(tableIndex(row, 0), cc);            tableItems.insert(tableIndex(sortedRow, 0), cc, 0);            for (int j = 0; j < cc; ++j)                tableItems[tableIndex(sortedRow, j)] = rowItems.at(j);            QTableWidgetItem *header = verticalHeaderItems.at(row);            verticalHeaderItems.remove(row);            verticalHeaderItems.insert(sortedRow, header);            // update persistent indexes            QModelIndexList oldPersistentIndexes = persistentIndexList();            QModelIndexList newPersistentIndexes = oldPersistentIndexes;            updateRowIndexes(newPersistentIndexes, row, sortedRow);            changePersistentIndexList(oldPersistentIndexes,                                      newPersistentIndexes);            emit layoutChanged();            return;        }    }    QModelIndex idx = QAbstractTableModel::index(row, column);    emit dataChanged(idx, idx);}QTableWidgetItem *QTableModel::takeItem(int row, int column){    long i = tableIndex(row, column);    QTableWidgetItem *itm = tableItems.value(i);    if (itm) {        itm->view = 0;        itm->d->id = -1;        tableItems[i] = 0;    }    return itm;}QTableWidgetItem *QTableModel::item(int row, int column) const{    return tableItems.value(tableIndex(row, column));}QTableWidgetItem *QTableModel::item(const QModelIndex &index) const{    if (!isValid(index))        return 0;    return tableItems.at(tableIndex(index.row(), index.column()));}void QTableModel::removeItem(QTableWidgetItem *item){    int i = tableItems.indexOf(item);    if (i != -1) {        tableItems[i] = 0;        QModelIndex idx = index(item);        emit dataChanged(idx, idx);        return;    }    i = verticalHeaderItems.indexOf(item);    if (i != -1) {        verticalHeaderItems[i] = 0;        emit headerDataChanged(Qt::Vertical, i, i);        return;    }    i = horizontalHeaderItems.indexOf(item);    if (i != -1) {        horizontalHeaderItems[i] = 0;        emit headerDataChanged(Qt::Horizontal, i, i);        return;    }}void QTableModel::setHorizontalHeaderItem(int section, QTableWidgetItem *item){    if (section < 0 || section >= horizontalHeaderItems.count())        return;    QTableWidgetItem *oldItem = horizontalHeaderItems.at(section);    if (item == oldItem)        return;    if (oldItem)        oldItem->view = 0;    delete oldItem;    QTableWidget *view = qobject_cast<QTableWidget*>(QObject::parent());    if (item) {        item->view = view;        item->itemFlags = Qt::ItemFlags(int(item->itemFlags)|ItemIsHeaderItem);    }    horizontalHeaderItems[section] = item;    emit headerDataChanged(Qt::Horizontal, section, section);}void QTableModel::setVerticalHeaderItem(int section, QTableWidgetItem *item){    if (section < 0 || section >= verticalHeaderItems.count())        return;    QTableWidgetItem *oldItem = verticalHeaderItems.at(section);    if (item == oldItem)        return;    if (oldItem)        oldItem->view = 0;    delete oldItem;    QTableWidget *view = qobject_cast<QTableWidget*>(QObject::parent());    if (item) {        item->view = view;        item->itemFlags = Qt::ItemFlags(int(item->itemFlags)|ItemIsHeaderItem);    }    verticalHeaderItems[section] = item;    emit headerDataChanged(Qt::Vertical, section, section);}QTableWidgetItem *QTableModel::takeHorizontalHeaderItem(int section){    if (section < 0 || section >= horizontalHeaderItems.count())        return 0;    QTableWidgetItem *itm = horizontalHeaderItems.at(section);    if (itm) {        itm->view = 0;        itm->itemFlags &= ~ItemIsHeaderItem;        horizontalHeaderItems[section] = 0;    }    return itm;}QTableWidgetItem *QTableModel::takeVerticalHeaderItem(int section){    if (section < 0 || section >= verticalHeaderItems.count())        return 0;    QTableWidgetItem *itm = verticalHeaderItems.at(section);    if (itm) {        itm->view = 0;        itm->itemFlags &= ~ItemIsHeaderItem;        verticalHeaderItems[section] = 0;    }    return itm;}QTableWidgetItem *QTableModel::horizontalHeaderItem(int section){    return horizontalHeaderItems.value(section);}QTableWidgetItem *QTableModel::verticalHeaderItem(int section){    return verticalHeaderItems.value(section);}QModelIndex QTableModel::index(const QTableWidgetItem *item) const{    if (!item)        return QModelIndex();    int i = -1;    const int id = item->d->id;    if (id >= 0 && id < tableItems.count() && tableItems.at(id) == item) {        i = id;    } else { // we need to search for the item        i = tableItems.indexOf(const_cast<QTableWidgetItem*>(item));        if (i == -1) // not found            return QModelIndex();    }    int row = i / columnCount();    int col = i % columnCount();    return QAbstractTableModel::index(row, col);}void QTableModel::setRowCount(int rows){    int rc = verticalHeaderItems.count();    if (rows < 0 || rc == rows)        return;    if (rc < rows)        insertRows(qMax(rc, 0), rows - rc);    else        removeRows(qMax(rows, 0), rc - rows);}void QTableModel::setColumnCount(int columns){    int cc = horizontalHeaderItems.count();    if (columns < 0 || cc == columns)        return;    if (cc < columns)        insertColumns(qMax(cc, 0), columns - cc);    else        removeColumns(qMax(columns, 0), cc - columns);}int QTableModel::rowCount(const QModelIndex &parent) const{    return parent.isValid() ? 0 : verticalHeaderItems.count();}int QTableModel::columnCount(const QModelIndex &parent) const{    return parent.isValid() ? 0 : horizontalHeaderItems.count();}QVariant QTableModel::data(const QModelIndex &index, int role) const{    QTableWidgetItem *itm = item(index);    if (itm)        return itm->data(role);    return QVariant();}bool QTableModel::setData(const QModelIndex &index, const QVariant &value, int role){    if (!index.isValid())        return false;    QTableWidgetItem *itm = item(index);    if (itm) {        itm->setData(role, value);        return true;    }    // don't create dummy table items for empty values    if (!value.isValid())        return false;    QTableWidget *view = qobject_cast<QTableWidget*>(QObject::parent());    if (!view)        return false;    itm = createItem();    itm->setData(role, value);    view->setItem(index.row(), index.column(), itm);    return true;}QMap<int, QVariant> QTableModel::itemData(const QModelIndex &index) const{    QMap<int, QVariant> roles;    QTableWidgetItem *itm = item(index);    if (itm) {        for (int i = 0; i < itm->values.count(); ++i) {            roles.insert(itm->values.at(i).role,                         itm->values.at(i).value);        }    }    return roles;}// reimplemented to ensure that only one dataChanged() signal is emittedbool QTableModel::setItemData(const QModelIndex &index, const QMap<int, QVariant> &roles){    if (!index.isValid())        return false;    QTableWidget *view = qobject_cast<QTableWidget*>(QObject::parent());    QTableWidgetItem *itm = item(index);    if (itm) {        itm->view = 0; // prohibits item from calling itemChanged()        bool changed = false;        for (QMap<int, QVariant>::ConstIterator it = roles.begin(); it != roles.end(); ++it) {            if (itm->data(it.key()) != it.value()) {                itm->setData(it.key(), it.value());                changed = true;            }        }        itm->view = view;        if (changed)            itemChanged(itm);        return true;    }    if (!view)        return false;    itm = createItem();    for (QMap<int, QVariant>::ConstIterator it = roles.begin(); it != roles.end(); ++it)        itm->setData(it.key(), it.value());

⌨️ 快捷键说明

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