File indexing completed on 2026-09-26 09:09:57
0001
0002
0003
0004
0005 #ifndef QTABLEWIDGET_H
0006 #define QTABLEWIDGET_H
0007
0008 #include <QtWidgets/qtableview.h>
0009 #include <QtWidgets/qtwidgetsglobal.h>
0010 #include <QtCore/qlist.h>
0011 #include <QtCore/qvariant.h>
0012
0013 QT_REQUIRE_CONFIG(tablewidget);
0014
0015 QT_BEGIN_NAMESPACE
0016
0017 class QTableWidgetSelectionRange
0018 {
0019 public:
0020 QTableWidgetSelectionRange() = default;
0021 QTableWidgetSelectionRange(int top, int left, int bottom, int right)
0022 : m_top(top), m_left(left), m_bottom(bottom), m_right(right)
0023 {}
0024
0025 friend bool operator==(const QTableWidgetSelectionRange &lhs,
0026 const QTableWidgetSelectionRange &rhs) noexcept
0027 {
0028 return lhs.m_top == rhs.m_top && lhs.m_left == rhs.m_left && lhs.m_bottom == rhs.m_bottom
0029 && lhs.m_right == rhs.m_right;
0030 }
0031 friend bool operator!=(const QTableWidgetSelectionRange &lhs,
0032 const QTableWidgetSelectionRange &rhs) noexcept
0033 { return !(lhs == rhs); }
0034
0035 inline int topRow() const { return m_top; }
0036 inline int bottomRow() const { return m_bottom; }
0037 inline int leftColumn() const { return m_left; }
0038 inline int rightColumn() const { return m_right; }
0039 inline int rowCount() const { return m_bottom - m_top + 1; }
0040 inline int columnCount() const { return m_right - m_left + 1; }
0041 private:
0042 int m_top = -1, m_left = -1, m_bottom = -2, m_right = -2;
0043 };
0044
0045 class QTableWidget;
0046 class QTableModel;
0047 class QWidgetItemData;
0048 class QTableWidgetItemPrivate;
0049
0050 class Q_WIDGETS_EXPORT QTableWidgetItem
0051 {
0052 friend class QTableWidget;
0053 friend class QTableModel;
0054 public:
0055 enum ItemType { Type = 0, UserType = 1000 };
0056 explicit QTableWidgetItem(int type = Type);
0057 explicit QTableWidgetItem(const QString &text, int type = Type);
0058 explicit QTableWidgetItem(const QIcon &icon, const QString &text, int type = Type);
0059 QTableWidgetItem(const QTableWidgetItem &other);
0060 virtual ~QTableWidgetItem();
0061
0062 virtual QTableWidgetItem *clone() const;
0063
0064 inline QTableWidget *tableWidget() const { return view; }
0065
0066 inline int row() const;
0067 inline int column() const;
0068
0069 void setSelected(bool select);
0070 bool isSelected() const;
0071
0072 inline Qt::ItemFlags flags() const { return itemFlags; }
0073 void setFlags(Qt::ItemFlags flags);
0074
0075 inline QString text() const
0076 { return data(Qt::DisplayRole).toString(); }
0077 inline void setText(const QString &text);
0078
0079 inline QIcon icon() const
0080 { return qvariant_cast<QIcon>(data(Qt::DecorationRole)); }
0081 inline void setIcon(const QIcon &icon);
0082
0083 inline QString statusTip() const
0084 { return data(Qt::StatusTipRole).toString(); }
0085 inline void setStatusTip(const QString &statusTip);
0086
0087 #if QT_CONFIG(tooltip)
0088 inline QString toolTip() const
0089 { return data(Qt::ToolTipRole).toString(); }
0090 inline void setToolTip(const QString &toolTip);
0091 #endif
0092
0093 #if QT_CONFIG(whatsthis)
0094 inline QString whatsThis() const
0095 { return data(Qt::WhatsThisRole).toString(); }
0096 inline void setWhatsThis(const QString &whatsThis);
0097 #endif
0098
0099 inline QFont font() const
0100 { return qvariant_cast<QFont>(data(Qt::FontRole)); }
0101 inline void setFont(const QFont &font);
0102
0103 #if QT_VERSION < QT_VERSION_CHECK(7, 0, 0)
0104 inline int textAlignment() const
0105 { return data(Qt::TextAlignmentRole).toInt(); }
0106 #else
0107 inline Qt::Alignment textAlignment() const
0108 { return qvariant_cast<Qt::Alignment>(data(Qt::TextAlignmentRole)); }
0109 #endif
0110 #if QT_DEPRECATED_SINCE(6, 4)
0111 QT_DEPRECATED_VERSION_X_6_4("Use the overload taking Qt::Alignment")
0112 inline void setTextAlignment(int alignment)
0113 { setData(Qt::TextAlignmentRole, alignment); }
0114 inline void setTextAlignment(Qt::AlignmentFlag alignment)
0115 { setData(Qt::TextAlignmentRole, QVariant::fromValue(Qt::Alignment(alignment))); }
0116 #endif
0117 inline void setTextAlignment(Qt::Alignment alignment)
0118 { setData(Qt::TextAlignmentRole, QVariant::fromValue(alignment)); }
0119
0120 inline QBrush background() const
0121 { return qvariant_cast<QBrush>(data(Qt::BackgroundRole)); }
0122 inline void setBackground(const QBrush &brush)
0123 { setData(Qt::BackgroundRole, brush.style() != Qt::NoBrush ? QVariant(brush) : QVariant()); }
0124
0125 inline QBrush foreground() const
0126 { return qvariant_cast<QBrush>(data(Qt::ForegroundRole)); }
0127 inline void setForeground(const QBrush &brush)
0128 { setData(Qt::ForegroundRole, brush.style() != Qt::NoBrush ? QVariant(brush) : QVariant()); }
0129
0130 inline Qt::CheckState checkState() const
0131 { return qvariant_cast<Qt::CheckState>(data(Qt::CheckStateRole)); }
0132 inline void setCheckState(Qt::CheckState state)
0133 { setData(Qt::CheckStateRole, state); }
0134
0135 inline QSize sizeHint() const
0136 { return qvariant_cast<QSize>(data(Qt::SizeHintRole)); }
0137 inline void setSizeHint(const QSize &size)
0138 { setData(Qt::SizeHintRole, size.isValid() ? QVariant(size) : QVariant()); }
0139
0140 virtual QVariant data(int role) const;
0141 virtual void setData(int role, const QVariant &value);
0142
0143 virtual bool operator<(const QTableWidgetItem &other) const;
0144
0145 #ifndef QT_NO_DATASTREAM
0146 virtual void read(QDataStream &in);
0147 virtual void write(QDataStream &out) const;
0148 #endif
0149 QTableWidgetItem &operator=(const QTableWidgetItem &other);
0150
0151 inline int type() const { return rtti; }
0152
0153 private:
0154 QTableModel *tableModel() const;
0155
0156 private:
0157 int rtti;
0158 QList<QWidgetItemData> values;
0159 QTableWidget *view;
0160 QTableWidgetItemPrivate *d;
0161 Qt::ItemFlags itemFlags;
0162 };
0163
0164 inline void QTableWidgetItem::setText(const QString &atext)
0165 { setData(Qt::DisplayRole, atext); }
0166
0167 inline void QTableWidgetItem::setIcon(const QIcon &aicon)
0168 { setData(Qt::DecorationRole, aicon); }
0169
0170 inline void QTableWidgetItem::setStatusTip(const QString &astatusTip)
0171 { setData(Qt::StatusTipRole, astatusTip); }
0172
0173 #if QT_CONFIG(tooltip)
0174 inline void QTableWidgetItem::setToolTip(const QString &atoolTip)
0175 { setData(Qt::ToolTipRole, atoolTip); }
0176 #endif
0177
0178 #if QT_CONFIG(whatsthis)
0179 inline void QTableWidgetItem::setWhatsThis(const QString &awhatsThis)
0180 { setData(Qt::WhatsThisRole, awhatsThis); }
0181 #endif
0182
0183 inline void QTableWidgetItem::setFont(const QFont &afont)
0184 { setData(Qt::FontRole, afont); }
0185
0186 #ifndef QT_NO_DATASTREAM
0187 Q_WIDGETS_EXPORT QDataStream &operator>>(QDataStream &in, QTableWidgetItem &item);
0188 Q_WIDGETS_EXPORT QDataStream &operator<<(QDataStream &out, const QTableWidgetItem &item);
0189 #endif
0190
0191 class QTableWidgetPrivate;
0192
0193 class Q_WIDGETS_EXPORT QTableWidget : public QTableView
0194 {
0195 Q_OBJECT
0196 Q_PROPERTY(int rowCount READ rowCount WRITE setRowCount)
0197 Q_PROPERTY(int columnCount READ columnCount WRITE setColumnCount)
0198 #if QT_CONFIG(draganddrop)
0199 Q_PROPERTY(Qt::DropActions supportedDragActions READ supportedDragActions WRITE setSupportedDragActions)
0200 #endif
0201
0202 friend class QTableModel;
0203 public:
0204 explicit QTableWidget(QWidget *parent = nullptr);
0205 QTableWidget(int rows, int columns, QWidget *parent = nullptr);
0206 ~QTableWidget();
0207
0208 void setRowCount(int rows);
0209 int rowCount() const;
0210
0211 void setColumnCount(int columns);
0212 int columnCount() const;
0213
0214 int row(const QTableWidgetItem *item) const;
0215 int column(const QTableWidgetItem *item) const;
0216
0217 QTableWidgetItem *item(int row, int column) const;
0218 void setItem(int row, int column, QTableWidgetItem *item);
0219 QTableWidgetItem *takeItem(int row, int column);
0220 QList<QTableWidgetItem*> items(const QMimeData *data) const;
0221 QModelIndex indexFromItem(const QTableWidgetItem *item) const;
0222 QTableWidgetItem *itemFromIndex(const QModelIndex &index) const;
0223
0224 QTableWidgetItem *verticalHeaderItem(int row) const;
0225 void setVerticalHeaderItem(int row, QTableWidgetItem *item);
0226 QTableWidgetItem *takeVerticalHeaderItem(int row);
0227
0228 QTableWidgetItem *horizontalHeaderItem(int column) const;
0229 void setHorizontalHeaderItem(int column, QTableWidgetItem *item);
0230 QTableWidgetItem *takeHorizontalHeaderItem(int column);
0231 void setVerticalHeaderLabels(const QStringList &labels);
0232 void setHorizontalHeaderLabels(const QStringList &labels);
0233
0234 int currentRow() const;
0235 int currentColumn() const;
0236 QTableWidgetItem *currentItem() const;
0237 void setCurrentItem(QTableWidgetItem *item);
0238 void setCurrentItem(QTableWidgetItem *item, QItemSelectionModel::SelectionFlags command);
0239 void setCurrentCell(int row, int column);
0240 void setCurrentCell(int row, int column, QItemSelectionModel::SelectionFlags command);
0241
0242 void sortItems(int column, Qt::SortOrder order = Qt::AscendingOrder);
0243 void setSortingEnabled(bool enable);
0244 bool isSortingEnabled() const;
0245
0246 void editItem(QTableWidgetItem *item);
0247 void openPersistentEditor(QTableWidgetItem *item);
0248 void closePersistentEditor(QTableWidgetItem *item);
0249 using QAbstractItemView::isPersistentEditorOpen;
0250 bool isPersistentEditorOpen(QTableWidgetItem *item) const;
0251
0252 QWidget *cellWidget(int row, int column) const;
0253 void setCellWidget(int row, int column, QWidget *widget);
0254 inline void removeCellWidget(int row, int column);
0255
0256 void setRangeSelected(const QTableWidgetSelectionRange &range, bool select);
0257
0258 QList<QTableWidgetSelectionRange> selectedRanges() const;
0259 QList<QTableWidgetItem*> selectedItems() const;
0260 QList<QTableWidgetItem*> findItems(const QString &text, Qt::MatchFlags flags) const;
0261
0262 int visualRow(int logicalRow) const;
0263 int visualColumn(int logicalColumn) const;
0264
0265 QTableWidgetItem *itemAt(const QPoint &p) const;
0266 inline QTableWidgetItem *itemAt(int x, int y) const;
0267 QRect visualItemRect(const QTableWidgetItem *item) const;
0268
0269 const QTableWidgetItem *itemPrototype() const;
0270 void setItemPrototype(const QTableWidgetItem *item);
0271
0272 #if QT_CONFIG(draganddrop)
0273 Qt::DropActions supportedDragActions() const;
0274 void setSupportedDragActions(Qt::DropActions actions);
0275 #endif
0276
0277 public Q_SLOTS:
0278 void scrollToItem(const QTableWidgetItem *item, QAbstractItemView::ScrollHint hint = EnsureVisible);
0279 void insertRow(int row);
0280 void insertColumn(int column);
0281 void removeRow(int row);
0282 void removeColumn(int column);
0283 void clear();
0284 void clearContents();
0285
0286 Q_SIGNALS:
0287 void itemPressed(QTableWidgetItem *item);
0288 void itemClicked(QTableWidgetItem *item);
0289 void itemDoubleClicked(QTableWidgetItem *item);
0290
0291 void itemActivated(QTableWidgetItem *item);
0292 void itemEntered(QTableWidgetItem *item);
0293 void itemChanged(QTableWidgetItem *item);
0294
0295 void currentItemChanged(QTableWidgetItem *current, QTableWidgetItem *previous);
0296 void itemSelectionChanged();
0297
0298 void cellPressed(int row, int column);
0299 void cellClicked(int row, int column);
0300 void cellDoubleClicked(int row, int column);
0301
0302 void cellActivated(int row, int column);
0303 void cellEntered(int row, int column);
0304 void cellChanged(int row, int column);
0305
0306 void currentCellChanged(int currentRow, int currentColumn, int previousRow, int previousColumn);
0307
0308 protected:
0309 bool event(QEvent *e) override;
0310 virtual QStringList mimeTypes() const;
0311 virtual QMimeData *mimeData(const QList<QTableWidgetItem *> &items) const;
0312 virtual bool dropMimeData(int row, int column, const QMimeData *data, Qt::DropAction action);
0313 virtual Qt::DropActions supportedDropActions() const;
0314
0315 protected:
0316 #if QT_CONFIG(draganddrop)
0317 void dropEvent(QDropEvent *event) override;
0318 #endif
0319 private:
0320 void setModel(QAbstractItemModel *model) override;
0321
0322 Q_DECLARE_PRIVATE(QTableWidget)
0323 Q_DISABLE_COPY(QTableWidget)
0324 };
0325
0326 inline void QTableWidget::removeCellWidget(int arow, int acolumn)
0327 { setCellWidget(arow, acolumn, nullptr); }
0328
0329 inline QTableWidgetItem *QTableWidget::itemAt(int ax, int ay) const
0330 { return itemAt(QPoint(ax, ay)); }
0331
0332 inline int QTableWidgetItem::row() const
0333 { return (view ? view->row(this) : -1); }
0334
0335 inline int QTableWidgetItem::column() const
0336 { return (view ? view->column(this) : -1); }
0337
0338 QT_END_NAMESPACE
0339
0340 #endif