1 /****************************************************************************
2 **
3 ** Copyright (C) 2016 The Qt Company Ltd.
4 ** Contact: https://www.qt.io/licensing/
5 **
6 ** This file is part of the QtWidgets module of the Qt Toolkit.
7 **
8 ** $QT_BEGIN_LICENSE:LGPL$
9 ** Commercial License Usage
10 ** Licensees holding valid commercial Qt licenses may use this file in
11 ** accordance with the commercial license agreement provided with the
12 ** Software or, alternatively, in accordance with the terms contained in
13 ** a written agreement between you and The Qt Company. For licensing terms
14 ** and conditions see https://www.qt.io/terms-conditions. For further
15 ** information use the contact form at https://www.qt.io/contact-us.
16 **
17 ** GNU Lesser General Public License Usage
18 ** Alternatively, this file may be used under the terms of the GNU Lesser
19 ** General Public License version 3 as published by the Free Software
20 ** Foundation and appearing in the file LICENSE.LGPL3 included in the
21 ** packaging of this file. Please review the following information to
22 ** ensure the GNU Lesser General Public License version 3 requirements
23 ** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
24 **
25 ** GNU General Public License Usage
26 ** Alternatively, this file may be used under the terms of the GNU
27 ** General Public License version 2.0 or (at your option) the GNU General
28 ** Public license version 3 or any later version approved by the KDE Free
29 ** Qt Foundation. The licenses are as published by the Free Software
30 ** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
31 ** included in the packaging of this file. Please review the following
32 ** information to ensure the GNU General Public License requirements will
33 ** be met: https://www.gnu.org/licenses/gpl-2.0.html and
34 ** https://www.gnu.org/licenses/gpl-3.0.html.
35 **
36 ** $QT_END_LICENSE$
37 **
38 ****************************************************************************/
39 
40 #ifndef QTABLEWIDGET_H
41 #define QTABLEWIDGET_H
42 
43 #include <QtWidgets/qtwidgetsglobal.h>
44 #include <QtWidgets/qtableview.h>
45 #include <QtCore/qvariant.h>
46 #include <QtCore/qvector.h>
47 
48 QT_REQUIRE_CONFIG(tablewidget);
49 
50 QT_BEGIN_NAMESPACE
51 
52 // ### Qt6 unexport the class, remove the user-defined special 3 and make it a literal type.
53 class Q_WIDGETS_EXPORT QTableWidgetSelectionRange
54 {
55 public:
56     QTableWidgetSelectionRange();
57     QTableWidgetSelectionRange(int top, int left, int bottom, int right);
58     ~QTableWidgetSelectionRange();
59 
60     QTableWidgetSelectionRange(const QTableWidgetSelectionRange &other);
61     QTableWidgetSelectionRange &operator=(const QTableWidgetSelectionRange &other);
62 
topRow()63     inline int topRow() const { return top; }
bottomRow()64     inline int bottomRow() const { return bottom; }
leftColumn()65     inline int leftColumn() const { return left; }
rightColumn()66     inline int rightColumn() const { return right; }
rowCount()67     inline int rowCount() const { return bottom - top + 1; }
columnCount()68     inline int columnCount() const { return right - left + 1; }
69 
70 private:
71     int top, left, bottom, right;
72 };
73 
74 class QTableWidget;
75 class QTableModel;
76 class QWidgetItemData;
77 class QTableWidgetItemPrivate;
78 
79 class Q_WIDGETS_EXPORT QTableWidgetItem
80 {
81     friend class QTableWidget;
82     friend class QTableModel;
83 public:
84     enum ItemType { Type = 0, UserType = 1000 };
85     explicit QTableWidgetItem(int type = Type);
86     explicit QTableWidgetItem(const QString &text, int type = Type);
87     explicit QTableWidgetItem(const QIcon &icon, const QString &text, int type = Type);
88     QTableWidgetItem(const QTableWidgetItem &other);
89     virtual ~QTableWidgetItem();
90 
91     virtual QTableWidgetItem *clone() const;
92 
tableWidget()93     inline QTableWidget *tableWidget() const { return view; }
94 
95     inline int row() const;
96     inline int column() const;
97 
98     void setSelected(bool select);
99     bool isSelected() const;
100 
flags()101     inline Qt::ItemFlags flags() const { return itemFlags; }
102     void setFlags(Qt::ItemFlags flags);
103 
text()104     inline QString text() const
105         { return data(Qt::DisplayRole).toString(); }
106     inline void setText(const QString &text);
107 
icon()108     inline QIcon icon() const
109         { return qvariant_cast<QIcon>(data(Qt::DecorationRole)); }
110     inline void setIcon(const QIcon &icon);
111 
statusTip()112     inline QString statusTip() const
113         { return data(Qt::StatusTipRole).toString(); }
114     inline void setStatusTip(const QString &statusTip);
115 
116 #ifndef QT_NO_TOOLTIP
toolTip()117     inline QString toolTip() const
118         { return data(Qt::ToolTipRole).toString(); }
119     inline void setToolTip(const QString &toolTip);
120 #endif
121 
122 #if QT_CONFIG(whatsthis)
whatsThis()123     inline QString whatsThis() const
124         { return data(Qt::WhatsThisRole).toString(); }
125     inline void setWhatsThis(const QString &whatsThis);
126 #endif
127 
font()128     inline QFont font() const
129         { return qvariant_cast<QFont>(data(Qt::FontRole)); }
130     inline void setFont(const QFont &font);
131 
textAlignment()132     inline int textAlignment() const
133         { return data(Qt::TextAlignmentRole).toInt(); }
setTextAlignment(int alignment)134     inline void setTextAlignment(int alignment)
135         { setData(Qt::TextAlignmentRole, alignment); }
136 
137 #if QT_DEPRECATED_SINCE(5, 13)
138     QT_DEPRECATED_X ("Use QTableWidgetItem::background() instead")
backgroundColor()139     inline QColor backgroundColor() const
140         { return qvariant_cast<QColor>(data(Qt::BackgroundRole)); }
141     QT_DEPRECATED_X ("Use QTableWidgetItem::setBackground() instead")
setBackgroundColor(const QColor & color)142     inline void setBackgroundColor(const QColor &color)
143         { setData(Qt::BackgroundRole, color); }
144 #endif
145 
background()146     inline QBrush background() const
147         { return qvariant_cast<QBrush>(data(Qt::BackgroundRole)); }
setBackground(const QBrush & brush)148     inline void setBackground(const QBrush &brush)
149         { setData(Qt::BackgroundRole, brush.style() != Qt::NoBrush ? QVariant(brush) : QVariant()); }
150 
151 #if QT_DEPRECATED_SINCE(5, 13)
152     QT_DEPRECATED_X ("Use QTableWidgetItem::foreground() instead")
textColor()153     inline QColor textColor() const
154         { return qvariant_cast<QColor>(data(Qt::ForegroundRole)); }
155     QT_DEPRECATED_X ("Use QTableWidgetItem::setForeground() instead")
setTextColor(const QColor & color)156     inline void setTextColor(const QColor &color)
157         { setData(Qt::ForegroundRole, color); }
158 #endif
159 
foreground()160     inline QBrush foreground() const
161         { return qvariant_cast<QBrush>(data(Qt::ForegroundRole)); }
setForeground(const QBrush & brush)162     inline void setForeground(const QBrush &brush)
163         { setData(Qt::ForegroundRole, brush.style() != Qt::NoBrush ? QVariant(brush) : QVariant()); }
164 
checkState()165     inline Qt::CheckState checkState() const
166         { return static_cast<Qt::CheckState>(data(Qt::CheckStateRole).toInt()); }
setCheckState(Qt::CheckState state)167     inline void setCheckState(Qt::CheckState state)
168         { setData(Qt::CheckStateRole, state); }
169 
sizeHint()170     inline QSize sizeHint() const
171         { return qvariant_cast<QSize>(data(Qt::SizeHintRole)); }
setSizeHint(const QSize & size)172     inline void setSizeHint(const QSize &size)
173         { setData(Qt::SizeHintRole, size.isValid() ? QVariant(size) : QVariant()); }
174 
175     virtual QVariant data(int role) const;
176     virtual void setData(int role, const QVariant &value);
177 
178     virtual bool operator<(const QTableWidgetItem &other) const;
179 
180 #ifndef QT_NO_DATASTREAM
181     virtual void read(QDataStream &in);
182     virtual void write(QDataStream &out) const;
183 #endif
184     QTableWidgetItem &operator=(const QTableWidgetItem &other);
185 
type()186     inline int type() const { return rtti; }
187 
188 private:
189     QTableModel *tableModel() const;
190 
191 private:
192     int rtti;
193     QVector<QWidgetItemData> values;
194     QTableWidget *view;
195     QTableWidgetItemPrivate *d;
196     Qt::ItemFlags itemFlags;
197 };
198 
setText(const QString & atext)199 inline void QTableWidgetItem::setText(const QString &atext)
200 { setData(Qt::DisplayRole, atext); }
201 
setIcon(const QIcon & aicon)202 inline void QTableWidgetItem::setIcon(const QIcon &aicon)
203 { setData(Qt::DecorationRole, aicon); }
204 
setStatusTip(const QString & astatusTip)205 inline void QTableWidgetItem::setStatusTip(const QString &astatusTip)
206 { setData(Qt::StatusTipRole, astatusTip); }
207 
208 #ifndef QT_NO_TOOLTIP
setToolTip(const QString & atoolTip)209 inline void QTableWidgetItem::setToolTip(const QString &atoolTip)
210 { setData(Qt::ToolTipRole, atoolTip); }
211 #endif
212 
213 #if QT_CONFIG(whatsthis)
setWhatsThis(const QString & awhatsThis)214 inline void QTableWidgetItem::setWhatsThis(const QString &awhatsThis)
215 { setData(Qt::WhatsThisRole, awhatsThis); }
216 #endif
217 
setFont(const QFont & afont)218 inline void QTableWidgetItem::setFont(const QFont &afont)
219 { setData(Qt::FontRole, afont); }
220 
221 #ifndef QT_NO_DATASTREAM
222 Q_WIDGETS_EXPORT QDataStream &operator>>(QDataStream &in, QTableWidgetItem &item);
223 Q_WIDGETS_EXPORT QDataStream &operator<<(QDataStream &out, const QTableWidgetItem &item);
224 #endif
225 
226 class QTableWidgetPrivate;
227 
228 class Q_WIDGETS_EXPORT QTableWidget : public QTableView
229 {
230     Q_OBJECT
231     Q_PROPERTY(int rowCount READ rowCount WRITE setRowCount)
232     Q_PROPERTY(int columnCount READ columnCount WRITE setColumnCount)
233 
234     friend class QTableModel;
235 public:
236     explicit QTableWidget(QWidget *parent = nullptr);
237     QTableWidget(int rows, int columns, QWidget *parent = nullptr);
238     ~QTableWidget();
239 
240     void setRowCount(int rows);
241     int rowCount() const;
242 
243     void setColumnCount(int columns);
244     int columnCount() const;
245 
246     int row(const QTableWidgetItem *item) const;
247     int column(const QTableWidgetItem *item) const;
248 
249     QTableWidgetItem *item(int row, int column) const;
250     void setItem(int row, int column, QTableWidgetItem *item);
251     QTableWidgetItem *takeItem(int row, int column);
252 
253     QTableWidgetItem *verticalHeaderItem(int row) const;
254     void setVerticalHeaderItem(int row, QTableWidgetItem *item);
255     QTableWidgetItem *takeVerticalHeaderItem(int row);
256 
257     QTableWidgetItem *horizontalHeaderItem(int column) const;
258     void setHorizontalHeaderItem(int column, QTableWidgetItem *item);
259     QTableWidgetItem *takeHorizontalHeaderItem(int column);
260     void setVerticalHeaderLabels(const QStringList &labels);
261     void setHorizontalHeaderLabels(const QStringList &labels);
262 
263     int currentRow() const;
264     int currentColumn() const;
265     QTableWidgetItem *currentItem() const;
266     void setCurrentItem(QTableWidgetItem *item);
267     void setCurrentItem(QTableWidgetItem *item, QItemSelectionModel::SelectionFlags command);
268     void setCurrentCell(int row, int column);
269     void setCurrentCell(int row, int column, QItemSelectionModel::SelectionFlags command);
270 
271     void sortItems(int column, Qt::SortOrder order = Qt::AscendingOrder);
272     void setSortingEnabled(bool enable);
273     bool isSortingEnabled() const;
274 
275     void editItem(QTableWidgetItem *item);
276     void openPersistentEditor(QTableWidgetItem *item);
277     void closePersistentEditor(QTableWidgetItem *item);
278     using QAbstractItemView::isPersistentEditorOpen;
279     bool isPersistentEditorOpen(QTableWidgetItem *item) const;
280 
281     QWidget *cellWidget(int row, int column) const;
282     void setCellWidget(int row, int column, QWidget *widget);
283     inline void removeCellWidget(int row, int column);
284 
285 #if QT_DEPRECATED_SINCE(5, 13)
286     QT_DEPRECATED_X ("Use QTableWidgetItem::isSelected() instead")
287     bool isItemSelected(const QTableWidgetItem *item) const;
288     QT_DEPRECATED_X ("Use QTableWidgetItem::setSelected() instead")
289     void setItemSelected(const QTableWidgetItem *item, bool select);
290 #endif
291     void setRangeSelected(const QTableWidgetSelectionRange &range, bool select);
292 
293     QList<QTableWidgetSelectionRange> selectedRanges() const;
294     QList<QTableWidgetItem*> selectedItems() const;
295     QList<QTableWidgetItem*> findItems(const QString &text, Qt::MatchFlags flags) const;
296 
297     int visualRow(int logicalRow) const;
298     int visualColumn(int logicalColumn) const;
299 
300     QTableWidgetItem *itemAt(const QPoint &p) const;
301     inline QTableWidgetItem *itemAt(int x, int y) const;
302     QRect visualItemRect(const QTableWidgetItem *item) const;
303 
304     const QTableWidgetItem *itemPrototype() const;
305     void setItemPrototype(const QTableWidgetItem *item);
306 
307 public Q_SLOTS:
308     void scrollToItem(const QTableWidgetItem *item, QAbstractItemView::ScrollHint hint = EnsureVisible);
309     void insertRow(int row);
310     void insertColumn(int column);
311     void removeRow(int row);
312     void removeColumn(int column);
313     void clear();
314     void clearContents();
315 
316 Q_SIGNALS:
317     void itemPressed(QTableWidgetItem *item);
318     void itemClicked(QTableWidgetItem *item);
319     void itemDoubleClicked(QTableWidgetItem *item);
320 
321     void itemActivated(QTableWidgetItem *item);
322     void itemEntered(QTableWidgetItem *item);
323     // ### Qt 6: add changed roles
324     void itemChanged(QTableWidgetItem *item);
325 
326     void currentItemChanged(QTableWidgetItem *current, QTableWidgetItem *previous);
327     void itemSelectionChanged();
328 
329     void cellPressed(int row, int column);
330     void cellClicked(int row, int column);
331     void cellDoubleClicked(int row, int column);
332 
333     void cellActivated(int row, int column);
334     void cellEntered(int row, int column);
335     void cellChanged(int row, int column);
336 
337     void currentCellChanged(int currentRow, int currentColumn, int previousRow, int previousColumn);
338 
339 protected:
340     bool event(QEvent *e) override;
341     virtual QStringList mimeTypes() const;
342 #if QT_VERSION >= QT_VERSION_CHECK(6,0,0)
343     virtual QMimeData *mimeData(const QList<QTableWidgetItem *> &items) const;
344 #else
345     virtual QMimeData *mimeData(const QList<QTableWidgetItem*> items) const;
346 #endif
347     virtual bool dropMimeData(int row, int column, const QMimeData *data, Qt::DropAction action);
348     virtual Qt::DropActions supportedDropActions() const;
349 
350 #if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)
351 public:
352 #else
353 protected:
354 #endif
355     QList<QTableWidgetItem*> items(const QMimeData *data) const;
356 
357     QModelIndex indexFromItem(const QTableWidgetItem *item) const;
358 #if QT_VERSION < QT_VERSION_CHECK(6, 0, 0)
359     QModelIndex indexFromItem(QTableWidgetItem *item) const; // ### Qt 6: remove
360 #endif
361     QTableWidgetItem *itemFromIndex(const QModelIndex &index) const;
362 
363 protected:
364 #if QT_CONFIG(draganddrop)
365     void dropEvent(QDropEvent *event) override;
366 #endif
367 private:
368     void setModel(QAbstractItemModel *model) override;
369 
370     Q_DECLARE_PRIVATE(QTableWidget)
371     Q_DISABLE_COPY(QTableWidget)
372 
373     Q_PRIVATE_SLOT(d_func(), void _q_emitItemPressed(const QModelIndex &index))
374     Q_PRIVATE_SLOT(d_func(), void _q_emitItemClicked(const QModelIndex &index))
375     Q_PRIVATE_SLOT(d_func(), void _q_emitItemDoubleClicked(const QModelIndex &index))
376     Q_PRIVATE_SLOT(d_func(), void _q_emitItemActivated(const QModelIndex &index))
377     Q_PRIVATE_SLOT(d_func(), void _q_emitItemEntered(const QModelIndex &index))
378     Q_PRIVATE_SLOT(d_func(), void _q_emitItemChanged(const QModelIndex &index))
379     Q_PRIVATE_SLOT(d_func(), void _q_emitCurrentItemChanged(const QModelIndex &previous, const QModelIndex &current))
380     Q_PRIVATE_SLOT(d_func(), void _q_sort())
381     Q_PRIVATE_SLOT(d_func(), void _q_dataChanged(const QModelIndex &topLeft, const QModelIndex &bottomRight))
382 };
383 
removeCellWidget(int arow,int acolumn)384 inline void QTableWidget::removeCellWidget(int arow, int acolumn)
385 { setCellWidget(arow, acolumn, nullptr); }
386 
itemAt(int ax,int ay)387 inline QTableWidgetItem *QTableWidget::itemAt(int ax, int ay) const
388 { return itemAt(QPoint(ax, ay)); }
389 
row()390 inline int QTableWidgetItem::row() const
391 { return (view ? view->row(this) : -1); }
392 
column()393 inline int QTableWidgetItem::column() const
394 { return (view ? view->column(this) : -1); }
395 
396 QT_END_NAMESPACE
397 
398 #endif // QTABLEWIDGET_H
399