HAL
general_table_widget.cpp
Go to the documentation of this file.
2 
3 #include <QMenu>
4 #include <QHeaderView>
5 #include <QApplication>
6 #include <QClipboard>
7 
8 namespace hal
9 {
11  {
12  setColumnCount(2);
16 
18  verticalHeader()->hide();
20  setShowGrid(false);
27 
28  //setMaximumHeight(verticalHeader()->length());
29  //resizeColumnToContents(0);
30  //mGeneralView->resizeColumnsToContents();
31  //mGeneralView->setFixedSize(DetailsTableUtilities::tableViewSize(mGeneralView,mGeneralModel->rowCount(),mGeneralModel->columnCount()));
32 
33  connect(this, &GeneralTableWidget::customContextMenuRequested, this, &GeneralTableWidget::serveContextMenu);
34  connect(this, &GeneralTableWidget::doubleClicked, this, &GeneralTableWidget::handleDoubleClick);
35  }
36 
37  void GeneralTableWidget::setRow(const QString& key, const QString& val, QMenu* contextMenu, std::function<void()> doubleClickAction)
38  {
39  if(mKeyItemMap.contains(key))
40  {
41  QTableWidgetItem* valItem = mKeyItemMap.value(key);
42 
43  valItem->setText(val);
44 
45  if(contextMenu == nullptr)
46  {
47  int rowIndex = valItem->row();
48  mRowMenuMap.remove(rowIndex);
49  }
50 
51  if(doubleClickAction == nullptr)
52  {
53  int rowIndex = valItem->row();
54  mRowDoubleClickActionMap.remove(rowIndex);
55  }
56  }
57  else
58  {
59  int rowIndex = rowCount();
60 
61  setRowCount(rowCount() + 1);
62 
63  QTableWidgetItem* keyItem = new QTableWidgetItem(key);
64  QTableWidgetItem* valItem = new QTableWidgetItem(val);
65 
66  setItem(rowIndex, 0, keyItem);
67  setItem(rowIndex, 1, valItem);
68 
69  mKeyItemMap.insert(key, valItem);
70 
71  if(contextMenu != nullptr)
72  if(!mRowMenuMap.contains(rowIndex))
73  mRowMenuMap.insert(rowIndex, contextMenu);
74 
75  if(doubleClickAction != nullptr)
76  if(!mRowDoubleClickActionMap.contains(rowIndex))
77  mRowDoubleClickActionMap.insert(rowIndex, doubleClickAction);
78  }
79  }
80 
81  void GeneralTableWidget::serveContextMenu(const QPoint& point) const
82  {
83  const QModelIndex clickedIndex = indexAt(point);
84 
85  if(clickedIndex.isValid())
86  {
87  int row = clickedIndex.row();
88 
89  if(mRowMenuMap.contains(row))
90  {
91  QMenu* menu = mRowMenuMap.value(clickedIndex.row());
92  menu->exec(viewport()->mapToGlobal(point));
93  }
94  }
95  }
96 
97  void GeneralTableWidget::handleDoubleClick(const QModelIndex& index) const
98  {
99  if(index.isValid())
100  {
101  int row = index.row();
102 
103  if(mRowDoubleClickActionMap.contains(row))
104  {
105  std::function<void()> action = mRowDoubleClickActionMap.value(row);
106  action();
107  }
108  }
109  }
110 
112  {
114 
115  int rows = rowCount();
116  int columns = columnCount();
117 
118  int w = 0;
119  int h = 0;
120 
121  //necessary to test if the table is empty, otherwise (due to the resizeColumnsToContents function)
122  //is the table's width far too big, so just set 0 as the size
123 
124  if(rows != 0)
125  {
126  w = verticalHeader()->width() + 4; // +4 seems to be needed
127 
128  for (int i = 0; i < columns; i++)
129  w += columnWidth(i); // seems to include gridline
130 
131 
132  h = horizontalHeader()->height() + 4;
133 
134  for (int i = 0; i < rows; i++)
135  h += rowHeight(i);
136 
137  w = w + 5; //no contemporary source exists why 5 is the magic number here (my guess would be it's the width of the hidden scrollbar)
138  }
139 
140  setFixedSize(QSize(w, h));
141  }
142 
144  {
146  }
147 }
GeneralTableWidget(QWidget *parent=nullptr)
void setRow(const QString &key, const QString &val, QMenu *contextMenu=nullptr, std::function< void()> doubleClickAction=nullptr)
void copyToClipboard(const QString &text) const
action
Definition: control.py:16
void doubleClicked(const QModelIndex &index)
void setEditTriggers(QAbstractItemView::EditTriggers triggers)
void setSelectionBehavior(QAbstractItemView::SelectionBehavior behavior)
void setSelectionMode(QAbstractItemView::SelectionMode mode)
void setHorizontalScrollBarPolicy(Qt::ScrollBarPolicy)
void setVerticalScrollBarPolicy(Qt::ScrollBarPolicy)
QWidget * viewport() const const
void setText(const QString &text, QClipboard::Mode mode)
void setFrameStyle(int style)
QClipboard * clipboard()
void setDefaultSectionSize(int size)
bool contains(const Key &key) const const
QMap::iterator insert(const Key &key, const T &value)
int remove(const Key &key)
const T value(const Key &key, const T &defaultValue) const const
QAction * exec()
bool isValid() const const
int row() const const
QMetaObject::Connection connect(const QObject *sender, const char *signal, const QObject *receiver, const char *method, Qt::ConnectionType type)
CustomContextMenu
ScrollBarAlwaysOff
int columnWidth(int column) const const
QHeaderView * horizontalHeader() const const
virtual QModelIndex indexAt(const QPoint &pos) const const override
void resizeColumnsToContents()
int rowHeight(int row) const const
void setShowGrid(bool show)
QHeaderView * verticalHeader() const const
int row(const QTableWidgetItem *item) const const
void setColumnCount(int columns)
void setItem(int row, int column, QTableWidgetItem *item)
void setRowCount(int rows)
int row() const const
void setText(const QString &text)
void setContextMenuPolicy(Qt::ContextMenuPolicy policy)
void customContextMenuRequested(const QPoint &pos)
void setFocusPolicy(Qt::FocusPolicy policy)
void hide()
QPoint mapToGlobal(const QPoint &pos) const const
void setFixedSize(const QSize &s)
void setSizePolicy(QSizePolicy)