1// Copyright (C) 2016 The Qt Company Ltd.
2// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
3
4#ifndef QTABLEWIDGET_H
5#define QTABLEWIDGET_H
6
7#include <QtWidgets/qtableview.h>
8#include <QtWidgets/qtwidgetsglobal.h>
9#include <QtCore/qlist.h>
10#include <QtCore/qvariant.h>
11
12QT_REQUIRE_CONFIG(tablewidget);
13
14QT_BEGIN_NAMESPACE
15
16class QTableWidgetSelectionRange
17{
18public:
19 QTableWidgetSelectionRange() = default;
20 QTableWidgetSelectionRange(int top, int left, int bottom, int right)
21 : m_top(top), m_left(left), m_bottom(bottom), m_right(right)
22 {}
23
24 friend bool operator==(const QTableWidgetSelectionRange &lhs,
25 const QTableWidgetSelectionRange &rhs) noexcept
26 {
27 return lhs.m_top == rhs.m_top && lhs.m_left == rhs.m_left && lhs.m_bottom == rhs.m_bottom
28 && lhs.m_right == rhs.m_right;
29 }
30 friend bool operator!=(const QTableWidgetSelectionRange &lhs,
31 const QTableWidgetSelectionRange &rhs) noexcept
32 { return !(lhs == rhs); }
33
34 inline int topRow() const { return m_top; }
35 inline int bottomRow() const { return m_bottom; }
36 inline int leftColumn() const { return m_left; }
37 inline int rightColumn() const { return m_right; }
38 inline int rowCount() const { return m_bottom - m_top + 1; }
39 inline int columnCount() const { return m_right - m_left + 1; }
40private:
41 int m_top = -1, m_left = -1, m_bottom = -2, m_right = -2;
42};
43
44class QTableWidget;
45class QTableModel;
46class QWidgetItemData;
47class QTableWidgetItemPrivate;
48
49class Q_WIDGETS_EXPORT QTableWidgetItem
50{
51 friend class QTableWidget;
52 friend class QTableModel;
53public:
54 enum ItemType { Type = 0, UserType = 1000 };
55 explicit QTableWidgetItem(int type = Type);
56 explicit QTableWidgetItem(const QString &text, int type = Type);
57 explicit QTableWidgetItem(const QIcon &icon, const QString &text, int type = Type);
58 QTableWidgetItem(const QTableWidgetItem &other);
59 virtual ~QTableWidgetItem();
60
61 virtual QTableWidgetItem *clone() const;
62
63 inline QTableWidget *tableWidget() const { return view; }
64
65 inline int row() const;
66 inline int column() const;
67
68 void setSelected(bool select);
69 bool isSelected() const;
70
71 inline Qt::ItemFlags flags() const { return itemFlags; }
72 void setFlags(Qt::ItemFlags flags);
73
74 inline QString text() const
75 { return data(role: Qt::DisplayRole).toString(); }
76 inline void setText(const QString &text);
77
78 inline QIcon icon() const
79 { return qvariant_cast<QIcon>(v: data(role: Qt::DecorationRole)); }
80 inline void setIcon(const QIcon &icon);
81
82 inline QString statusTip() const
83 { return data(role: Qt::StatusTipRole).toString(); }
84 inline void setStatusTip(const QString &statusTip);
85
86#if QT_CONFIG(tooltip)
87 inline QString toolTip() const
88 { return data(role: Qt::ToolTipRole).toString(); }
89 inline void setToolTip(const QString &toolTip);
90#endif
91
92#if QT_CONFIG(whatsthis)
93 inline QString whatsThis() const
94 { return data(role: Qt::WhatsThisRole).toString(); }
95 inline void setWhatsThis(const QString &whatsThis);
96#endif
97
98 inline QFont font() const
99 { return qvariant_cast<QFont>(v: data(role: Qt::FontRole)); }
100 inline void setFont(const QFont &font);
101
102#if QT_VERSION < QT_VERSION_CHECK(7, 0, 0)
103 inline int textAlignment() const
104 { return data(role: Qt::TextAlignmentRole).toInt(); }
105#else
106 inline Qt::Alignment textAlignment() const
107 { return qvariant_cast<Qt::Alignment>(data(Qt::TextAlignmentRole)); }
108#endif
109#if QT_DEPRECATED_SINCE(6, 4)
110 QT_DEPRECATED_VERSION_X_6_4("Use the overload taking Qt::Alignment")
111 inline void setTextAlignment(int alignment)
112 { setData(role: Qt::TextAlignmentRole, value: alignment); }
113 inline void setTextAlignment(Qt::AlignmentFlag alignment)
114 { setData(role: Qt::TextAlignmentRole, value: QVariant::fromValue(value: Qt::Alignment(alignment))); }
115#endif
116 inline void setTextAlignment(Qt::Alignment alignment)
117 { setData(role: Qt::TextAlignmentRole, value: QVariant::fromValue(value: alignment)); }
118
119 inline QBrush background() const
120 { return qvariant_cast<QBrush>(v: data(role: Qt::BackgroundRole)); }
121 inline void setBackground(const QBrush &brush)
122 { setData(role: Qt::BackgroundRole, value: brush.style() != Qt::NoBrush ? QVariant(brush) : QVariant()); }
123
124 inline QBrush foreground() const
125 { return qvariant_cast<QBrush>(v: data(role: Qt::ForegroundRole)); }
126 inline void setForeground(const QBrush &brush)
127 { setData(role: Qt::ForegroundRole, value: brush.style() != Qt::NoBrush ? QVariant(brush) : QVariant()); }
128
129 inline Qt::CheckState checkState() const
130 { return qvariant_cast<Qt::CheckState>(v: data(role: Qt::CheckStateRole)); }
131 inline void setCheckState(Qt::CheckState state)
132 { setData(role: Qt::CheckStateRole, value: state); }
133
134 inline QSize sizeHint() const
135 { return qvariant_cast<QSize>(v: data(role: Qt::SizeHintRole)); }
136 inline void setSizeHint(const QSize &size)
137 { setData(role: Qt::SizeHintRole, value: size.isValid() ? QVariant(size) : QVariant()); }
138
139 virtual QVariant data(int role) const;
140 virtual void setData(int role, const QVariant &value);
141
142 virtual bool operator<(const QTableWidgetItem &other) const;
143
144#ifndef QT_NO_DATASTREAM
145 virtual void read(QDataStream &in);
146 virtual void write(QDataStream &out) const;
147#endif
148 QTableWidgetItem &operator=(const QTableWidgetItem &other);
149
150 inline int type() const { return rtti; }
151
152private:
153 QTableModel *tableModel() const;
154
155private:
156 int rtti;
157 QList<QWidgetItemData> values;
158 QTableWidget *view;
159 QTableWidgetItemPrivate *d;
160 Qt::ItemFlags itemFlags;
161};
162
163inline void QTableWidgetItem::setText(const QString &atext)
164{ setData(role: Qt::DisplayRole, value: atext); }
165
166inline void QTableWidgetItem::setIcon(const QIcon &aicon)
167{ setData(role: Qt::DecorationRole, value: aicon); }
168
169inline void QTableWidgetItem::setStatusTip(const QString &astatusTip)
170{ setData(role: Qt::StatusTipRole, value: astatusTip); }
171
172#if QT_CONFIG(tooltip)
173inline void QTableWidgetItem::setToolTip(const QString &atoolTip)
174{ setData(role: Qt::ToolTipRole, value: atoolTip); }
175#endif
176
177#if QT_CONFIG(whatsthis)
178inline void QTableWidgetItem::setWhatsThis(const QString &awhatsThis)
179{ setData(role: Qt::WhatsThisRole, value: awhatsThis); }
180#endif
181
182inline void QTableWidgetItem::setFont(const QFont &afont)
183{ setData(role: Qt::FontRole, value: afont); }
184
185#ifndef QT_NO_DATASTREAM
186Q_WIDGETS_EXPORT QDataStream &operator>>(QDataStream &in, QTableWidgetItem &item);
187Q_WIDGETS_EXPORT QDataStream &operator<<(QDataStream &out, const QTableWidgetItem &item);
188#endif
189
190class QTableWidgetPrivate;
191
192class Q_WIDGETS_EXPORT QTableWidget : public QTableView
193{
194 Q_OBJECT
195 Q_PROPERTY(int rowCount READ rowCount WRITE setRowCount)
196 Q_PROPERTY(int columnCount READ columnCount WRITE setColumnCount)
197#if QT_CONFIG(draganddrop)
198 Q_PROPERTY(Qt::DropActions supportedDragActions READ supportedDragActions WRITE setSupportedDragActions)
199#endif
200
201 friend class QTableModel;
202public:
203 explicit QTableWidget(QWidget *parent = nullptr);
204 QTableWidget(int rows, int columns, QWidget *parent = nullptr);
205 ~QTableWidget();
206
207 void setRowCount(int rows);
208 int rowCount() const;
209
210 void setColumnCount(int columns);
211 int columnCount() const;
212
213 int row(const QTableWidgetItem *item) const;
214 int column(const QTableWidgetItem *item) const;
215
216 QTableWidgetItem *item(int row, int column) const;
217 void setItem(int row, int column, QTableWidgetItem *item);
218 QTableWidgetItem *takeItem(int row, int column);
219 QList<QTableWidgetItem*> items(const QMimeData *data) const;
220 QModelIndex indexFromItem(const QTableWidgetItem *item) const;
221 QTableWidgetItem *itemFromIndex(const QModelIndex &index) const;
222
223 QTableWidgetItem *verticalHeaderItem(int row) const;
224 void setVerticalHeaderItem(int row, QTableWidgetItem *item);
225 QTableWidgetItem *takeVerticalHeaderItem(int row);
226
227 QTableWidgetItem *horizontalHeaderItem(int column) const;
228 void setHorizontalHeaderItem(int column, QTableWidgetItem *item);
229 QTableWidgetItem *takeHorizontalHeaderItem(int column);
230 void setVerticalHeaderLabels(const QStringList &labels);
231 void setHorizontalHeaderLabels(const QStringList &labels);
232
233 int currentRow() const;
234 int currentColumn() const;
235 QTableWidgetItem *currentItem() const;
236 void setCurrentItem(QTableWidgetItem *item);
237 void setCurrentItem(QTableWidgetItem *item, QItemSelectionModel::SelectionFlags command);
238 void setCurrentCell(int row, int column);
239 void setCurrentCell(int row, int column, QItemSelectionModel::SelectionFlags command);
240
241 void sortItems(int column, Qt::SortOrder order = Qt::AscendingOrder);
242 void setSortingEnabled(bool enable);
243 bool isSortingEnabled() const;
244
245 void editItem(QTableWidgetItem *item);
246 void openPersistentEditor(QTableWidgetItem *item);
247 void closePersistentEditor(QTableWidgetItem *item);
248 using QAbstractItemView::isPersistentEditorOpen;
249 bool isPersistentEditorOpen(QTableWidgetItem *item) const;
250
251 QWidget *cellWidget(int row, int column) const;
252 void setCellWidget(int row, int column, QWidget *widget);
253 inline void removeCellWidget(int row, int column);
254
255 void setRangeSelected(const QTableWidgetSelectionRange &range, bool select);
256
257 QList<QTableWidgetSelectionRange> selectedRanges() const;
258 QList<QTableWidgetItem*> selectedItems() const;
259 QList<QTableWidgetItem*> findItems(const QString &text, Qt::MatchFlags flags) const;
260
261 int visualRow(int logicalRow) const;
262 int visualColumn(int logicalColumn) const;
263
264 QTableWidgetItem *itemAt(const QPoint &p) const;
265 inline QTableWidgetItem *itemAt(int x, int y) const;
266 QRect visualItemRect(const QTableWidgetItem *item) const;
267
268 const QTableWidgetItem *itemPrototype() const;
269 void setItemPrototype(const QTableWidgetItem *item);
270
271#if QT_CONFIG(draganddrop)
272 Qt::DropActions supportedDragActions() const;
273 void setSupportedDragActions(Qt::DropActions actions);
274#endif
275
276public Q_SLOTS:
277 void scrollToItem(const QTableWidgetItem *item, QAbstractItemView::ScrollHint hint = EnsureVisible);
278 void insertRow(int row);
279 void insertColumn(int column);
280 void removeRow(int row);
281 void removeColumn(int column);
282 void clear();
283 void clearContents();
284
285Q_SIGNALS:
286 void itemPressed(QTableWidgetItem *item);
287 void itemClicked(QTableWidgetItem *item);
288 void itemDoubleClicked(QTableWidgetItem *item);
289
290 void itemActivated(QTableWidgetItem *item);
291 void itemEntered(QTableWidgetItem *item);
292 void itemChanged(QTableWidgetItem *item);
293
294 void currentItemChanged(QTableWidgetItem *current, QTableWidgetItem *previous);
295 void itemSelectionChanged();
296
297 void cellPressed(int row, int column);
298 void cellClicked(int row, int column);
299 void cellDoubleClicked(int row, int column);
300
301 void cellActivated(int row, int column);
302 void cellEntered(int row, int column);
303 void cellChanged(int row, int column);
304
305 void currentCellChanged(int currentRow, int currentColumn, int previousRow, int previousColumn);
306
307protected:
308 bool event(QEvent *e) override;
309 virtual QStringList mimeTypes() const;
310 virtual QMimeData *mimeData(const QList<QTableWidgetItem *> &items) const;
311 virtual bool dropMimeData(int row, int column, const QMimeData *data, Qt::DropAction action);
312 virtual Qt::DropActions supportedDropActions() const;
313
314protected:
315#if QT_CONFIG(draganddrop)
316 void dropEvent(QDropEvent *event) override;
317#endif
318private:
319 void setModel(QAbstractItemModel *model) override;
320
321 Q_DECLARE_PRIVATE(QTableWidget)
322 Q_DISABLE_COPY(QTableWidget)
323};
324
325inline void QTableWidget::removeCellWidget(int arow, int acolumn)
326{ setCellWidget(row: arow, column: acolumn, widget: nullptr); }
327
328inline QTableWidgetItem *QTableWidget::itemAt(int ax, int ay) const
329{ return itemAt(p: QPoint(ax, ay)); }
330
331inline int QTableWidgetItem::row() const
332{ return (view ? view->row(item: this) : -1); }
333
334inline int QTableWidgetItem::column() const
335{ return (view ? view->column(item: this) : -1); }
336
337QT_END_NAMESPACE
338
339#endif // QTABLEWIDGET_H
340

source code of qtbase/src/widgets/itemviews/qtablewidget.h