HAL
graph_navigation_widget.cpp
Go to the documentation of this file.
2 
6 #include "gui/gui_globals.h"
7 
8 #include <QGridLayout>
9 #include <QHeaderView>
10 #include <QKeyEvent>
11 #include <QLabel>
12 #include <QScrollBar>
13 #include <QVBoxLayout>
14 #include <QShortcut>
15 #include <QDebug>
16 
17 namespace hal
18 {
20  {
21  Q_ASSERT(mNavigationWidget);
22 
23  if (event->key() == Qt::Key_Enter || event->key() == Qt::Key_Return || (event->key() == Qt::Key_Right && mNavigationWidget->direction() == SelectionRelay::Subfocus::Right)
24  || (event->key() == Qt::Key_Left && mNavigationWidget->direction() == SelectionRelay::Subfocus::Left))
25  {
27  return;
28  }
29 
30  if (event->key() == Qt::Key_Escape || (event->key() == Qt::Key_Left && mNavigationWidget->direction() == SelectionRelay::Subfocus::Right)
31  || (event->key() == Qt::Key_Right && mNavigationWidget->direction() == SelectionRelay::Subfocus::Left))
32  {
33  mNavigationWidget->closeRequest();
34  return;
35  }
36 
37  if (event->key() == Qt::Key_Tab && mNavigationWidget->hasBothWidgets())
38  {
39  mNavigationWidget->toggleWidget();
40  return;
41  }
42 
44  }
45 
47  {
48  mNavigationWidget->mAddToViewWidget->clearSelection();
50  }
51 
53  {
54  if (ev->type() == QEvent::KeyPress)
55  {
56  QKeyEvent* keyEvent = static_cast<QKeyEvent*>(ev);
57  if (keyEvent->key() == Qt::Key_Tab)
58  {
59  mNavigationWidget->toggleWidget();
60  return true;
61  }
62  }
63  return QTreeWidget::event(ev);
64  }
65 
67  {
68  mNavigationWidget->mNavigateWidget->clearSelection();
70  }
71 
73  {
74  Q_ASSERT(mNavigationWidget);
75 
76  if (ev->key() == Qt::Key_Enter || ev->key() == Qt::Key_Return || (ev->key() == Qt::Key_Right && mNavigationWidget->direction() == SelectionRelay::Subfocus::Right)
77  || (ev->key() == Qt::Key_Left && mNavigationWidget->direction() == SelectionRelay::Subfocus::Left))
78  {
80  return;
81  }
82 
83  if (ev->key() == Qt::Key_Escape || (ev->key() == Qt::Key_Left && mNavigationWidget->direction() == SelectionRelay::Subfocus::Right)
84  || (ev->key() == Qt::Key_Right && mNavigationWidget->direction() == SelectionRelay::Subfocus::Left))
85  {
86  mNavigationWidget->closeRequest();
87  return;
88  }
89 
90  if (ev->key() == Qt::Key_Tab && mNavigationWidget->hasBothWidgets())
91  {
92  mNavigationWidget->toggleWidget();
93  return;
94  }
95 
97  }
98 
100  {
101  if (topLevelItemCount() < 1)
102  return QModelIndex();
103  return indexFromItem(topLevelItem(0), 0);
104  }
105 
106  QList<QTreeWidgetItem*> GraphNavigationTreeWidget::selectedItemRecursion(QTreeWidgetItem* item) const
107  {
109  if (item->isSelected())
110  retval.append(item);
111  else
112  for (int ichild = 0; ichild < item->childCount(); ichild++)
113  retval.append(selectedItemRecursion(item->child(ichild)));
114  return retval;
115  }
116 
118  {
120  int n = topLevelItemCount();
121  for (int i = 0; i < n; i++)
122  retval += selectedItemRecursion(topLevelItem(i));
123  return retval;
124  }
125 
126  const int GraphNavigationWidget::sDefaultColumnWidth[] = {250, 50, 100, 80, 250};
127 
129  : QWidget(parent), mOnlyNavigate(onlyNavigate), mNavigateVisible(false), mAddToViewVisible(false), mViaNet(nullptr), mDirection(SelectionRelay::Subfocus::None)
130  {
131  QStringList headerLabels;
132  headerLabels << "Name"
133  << "ID"
134  << "Type"
135  << "Pin"
136  << "Parent Module";
137 
138  QGridLayout* layTop = new QGridLayout(this);
139  mTabs = new QTabWidget(this);
140 
141 // mNavigateFrame = new QFrame(this);
142 // mNavigateFrame->setFrameStyle(QFrame::StyledPanel | QFrame::Sunken);
143 // QVBoxLayout* layNavigateView = new QVBoxLayout(mNavigateFrame);
144 // QLabel* labNavigate = new QLabel("Navigate to …", mNavigateFrame);
145 // labNavigate->setFixedHeight(sLabelHeight);
146 // layNavigateView->addWidget(labNavigate);
147 // mNavigateWidget = new GraphNavigationTableWidget(this, mNavigateFrame);
148  mNavigateWidget = new GraphNavigationTableWidget(this, mTabs);
151  mNavigateWidget->setFocusPolicy(Qt::FocusPolicy::StrongFocus);
152  mNavigateWidget->horizontalHeader()->setStretchLastSection(false);
153  mNavigateWidget->verticalHeader()->hide();
154  mNavigateWidget->setColumnCount(5);
155  mNavigateWidget->setHorizontalHeaderLabels(headerLabels);
156  mNavigateWidget->setShowGrid(false);
157  connect(mNavigateWidget, &QTableWidget::cellDoubleClicked, this, &GraphNavigationWidget::handleNavigateSelected);
158  mTabs->addTab(mNavigateWidget, "Navigate to …");
159 // layNavigateView->addWidget(mNavigateWidget);
160 // layTop->addWidget(mNavigateFrame);
161 
162 // mAddToViewFrame = new QFrame(this);
163 // mAddToViewFrame->setFrameStyle(QFrame::StyledPanel | QFrame::Sunken);
164 // QVBoxLayout* layAddtoView = new QVBoxLayout(mAddToViewFrame);
165 // QLabel* labAddToView = new QLabel("Add to view …", mAddToViewFrame);
166 // labAddToView->setFixedHeight(sLabelHeight);
167 // layAddtoView->addWidget(labAddToView);
168 // mAddToViewWidget = new GraphNavigationTreeWidget(this, mAddToViewFrame);
169  mAddToViewWidget = new GraphNavigationTreeWidget(this, mTabs);
172  mAddToViewWidget->setFocusPolicy(Qt::FocusPolicy::StrongFocus);
173  mAddToViewWidget->header()->setStretchLastSection(false);
174  mAddToViewWidget->setColumnCount(5);
175  mAddToViewWidget->setHeaderLabels(headerLabels);
176  // mAddToViewWidget->setAllColumnsShowFocus(true);
177  connect(mAddToViewWidget, &QTreeWidget::itemDoubleClicked, this, &GraphNavigationWidget::handleAddToViewSelected);
178  mTabs->addTab(mAddToViewWidget, "Add to view …");
179  layTop->addWidget(mTabs);
180 // layAddtoView->addWidget(mAddToViewWidget);
181 // layTop->addWidget(mAddToViewFrame);
182 
183  QShortcut* tabKey = new QShortcut(QKeySequence(Qt::Key_Tab),this);
185  QShortcut* escKey = new QShortcut(QKeySequence(Qt::Key_Escape),this);
187  }
188 
189 
191  {
193  Q_EMIT resetFocus();
194  mViaNet = nullptr;
195  mOrigin = Node();
196  mDirection = SelectionRelay::Subfocus::None;
197  }
198 
199  void GraphNavigationWidget::viaNetByNode()
200  {
201  mViaNet = nullptr;
202  if (mOrigin.isNull())
203  return;
204 
206  NodeBox* nbox = boxes.boxForNode(mOrigin);
207  if (!nbox)
208  return;
209 
210  u32 netId = 0;
211  switch (mDirection)
212  {
214  return;
216  netId = nbox->item()->inputNets().at(gSelectionRelay->subfocusIndex());
217  break;
219  netId = nbox->item()->outputNets().at(gSelectionRelay->subfocusIndex());
220  break;
221  }
222 
223  mViaNet = gNetlist->get_net_by_id(netId);
224  }
225 
226  QStringList GraphNavigationWidget::moduleEntry(Module* m, Endpoint* ep)
227  {
228  Module* pm = m->get_parent_module();
229  QString parentName = pm ? QString::fromStdString(pm->get_name()) : QString("top level");
230  QString mtype = QString::fromStdString(m->get_type());
231  if (mtype.isEmpty())
232  mtype = "module";
233  else
234  mtype += " (module)";
235 
236  QString pinName = QString::fromStdString(ep->get_pin()->get_name());
237  Net* epNet = ep->get_net();
238  if (epNet)
239  {
240  if (const auto pin = m->get_pin_by_net(epNet); pin != nullptr)
241  {
242  pinName = QString::fromStdString(pin->get_name());
243  }
244  }
245  return QStringList() << QString::fromStdString(m->get_name()) << QString::number(m->get_id()) << mtype << pinName << parentName;
246  }
247 
248  QStringList GraphNavigationWidget::gateEntry(Gate* g, Endpoint* ep)
249  {
250  return QStringList() << QString::fromStdString(g->get_name()) << QString::number(g->get_id()) << QString::fromStdString(g->get_type()->get_name())
251  << QString::fromStdString(ep->get_pin()->get_name()) << QString::fromStdString(g->get_module()->get_name());
252  }
253 
254  QTreeWidgetItem* GraphNavigationWidget::itemFactory(const QStringList& fields, const Node& nd)
255  {
256  QTreeWidgetItem* retval = new QTreeWidgetItem(fields);
257  for (int i = 0; i < fields.size(); i++)
258  {
259  if (i == 1)
261  else
263  }
264  mAddToViewNodes.insert(retval, nd);
265  return retval;
266  }
267 
268  bool GraphNavigationWidget::addToViewItem(Endpoint* ep)
269  {
270  Gate* g = ep->get_gate();
271  if (!g)
272  return false;
273 
274  QStringList fields = gateEntry(g, ep);
275  QTreeWidgetItem* item = itemFactory(fields, Node(g->get_id(), Node::Gate));
276 
277  Module* pm = g->get_module();
278  while (pm && !mModulesInView.contains(pm))
279  {
280  auto itMod = mListedModules.find(pm);
281  if (itMod != mListedModules.end())
282  {
283  // parent already in tree
284  itMod.value()->addChild(item);
285  return true;
286  }
287  fields = moduleEntry(pm, ep);
288  QTreeWidgetItem* parentItem = itemFactory(fields, Node(pm->get_id(), Node::Module));
289  parentItem->addChild(item);
290  mListedModules.insert(pm, parentItem);
291  item = parentItem;
292  pm = pm->get_parent_module();
293  }
294  mAddToViewWidget->addTopLevelItem(item);
295  return true;
296  }
297 
298  void GraphNavigationWidget::addNavigateItem(Endpoint* ep, const Node& targetNode)
299  {
300  Gate* g = ep->get_gate();
301  Q_ASSERT(g);
302 
303  QStringList fields;
304 
305  switch (targetNode.type())
306  {
307  case Node::None:
308  return;
309  case Node::Gate:
310  fields = gateEntry(g, ep);
311  break;
312  case Node::Module:
313  Module* m = gNetlist->get_module_by_id(targetNode.id());
314  Q_ASSERT(m);
315  fields = moduleEntry(m, ep);
316  break;
317  }
318 
319  int n = mNavigateWidget->rowCount();
320  mNavigateNodes.append(targetNode);
321  mNavigateWidget->insertRow(n);
322  for (int icol = 0; icol < fields.size(); icol++)
323  {
324  QTableWidgetItem* cell = new QTableWidgetItem(fields.at(icol));
325  if (icol == 1)
327  else
329  mNavigateWidget->setItem(n, icol, cell);
330  }
331  }
332 
334  {
335  mOrigin = origin;
336  mViaNet = via_net;
337  mDirection = dir;
338  fillTable();
339  }
340 
342  {
343  mViaNet = nullptr;
344  mDirection = direction;
345 
346  switch (gSelectionRelay->focusType())
347  {
350  break;
353  Q_ASSERT(g);
354  mOrigin = Node(g->get_id(), Node::Gate);
355  viaNetByNode();
356  break;
357  }
360  Q_ASSERT(m);
361  mOrigin = Node(m->get_id(), Node::Module);
362  viaNetByNode();
363  break;
364  }
365  default:
366  break;
367  }
368  fillTable();
369  }
370 
371  void GraphNavigationWidget::setModulesInView()
372  {
374  {
375  Module* m;
376  Gate* g;
377  switch (nbox->type())
378  {
379  case Node::Module:
380  m = gNetlist->get_module_by_id(nbox->id());
381  Q_ASSERT(m);
382  setModuleInView(m);
383  break;
384  case Node::Gate:
385  g = gNetlist->get_gate_by_id(nbox->id());
386  Q_ASSERT(g);
387  setModuleInView(g->get_module());
388  break;
389  default:
390  break;
391  }
392  }
393  }
394 
396  {
397  return mNavigateVisible && mAddToViewVisible;
398  }
399 
401  {
402  if (!hasBothWidgets())
403  return;
404 // if (mNavigateWidget->hasFocus())
405  if (!mTabs->currentIndex())
406  {
407  mTabs->setCurrentIndex(1);
408  mAddToViewWidget->setFocus();
409  mAddToViewWidget->setCurrentIndex(mAddToViewWidget->firstIndex());
410  mNavigateWidget->clearSelection();
411  }
412  else
413  {
414  mTabs->setCurrentIndex(0);
415  mNavigateWidget->setFocus();
416  mNavigateWidget->setCurrentCell(0, 0);
417  mNavigateWidget->selectRow(0);
418  mAddToViewWidget->clearSelection();
419  }
420  }
421 
423  {
424  return !mNavigateVisible && !mAddToViewVisible;
425  }
426 
427  void GraphNavigationWidget::setModuleInView(Module* m)
428  {
429  if (!m)
430  return;
431  mModulesInView.insert(m);
432  Module* parentModule = m->get_parent_module();
433  setModuleInView(parentModule);
434  }
435 
436  void GraphNavigationWidget::fillTable()
437  {
438  mNavigateWidget->clearContents();
439  mNavigateWidget->setRowCount(0);
440  mNavigateNodes.clear();
441  mAddToViewWidget->clear();
442  mAddToViewNodes.clear();
443  mModulesInView.clear();
444  mEndpointNotInView.clear();
445  mListedModules.clear();
446 
447  if (!mViaNet || mDirection == SelectionRelay::Subfocus::None)
448  return;
449  setModulesInView();
450  mNavigateVisible = false;
451 
452  QSet<Node> listedTargets;
453 
454  for (Endpoint* ep : (mDirection == SelectionRelay::Subfocus::Left) ? mViaNet->get_sources() : mViaNet->get_destinations())
455  {
456  Gate* g = ep->get_gate();
457  if (!g)
458  continue; // gate not connected
459 
460  const NodeBoxes& boxes = gContentManager->getContextManagerWidget()->getCurrentContext()->getLayouter()->boxes();
461  const NodeBox* nbox = boxes.boxForGate(g);
462  if (nbox)
463  {
464  Node targetNode = nbox->getNode();
465  if (targetNode == mOrigin) // net loops back to origin
466  continue;
467 
468  if (listedTargets.contains(targetNode)) // already listed
469  continue;
470 
471  listedTargets.insert(targetNode);
472  addNavigateItem(ep, targetNode);
473  mNavigateVisible = true;
474  }
475  else
476  mEndpointNotInView.append(ep);
477  }
478 
479  if (mNavigateVisible)
480  {
481 // mNavigateFrame->show();
482  mTabs->setTabEnabled(0,true);
483  mTabs->setCurrentIndex(0);
484  mNavigateWidget->setCurrentCell(0, 0);
485  mNavigateWidget->selectRow(0);
486  mNavigateWidget->setFocus();
487  }
488  else
489  mTabs->setTabEnabled(0,false);
490 // mNavigateFrame->hide();
491 
492  mAddToViewVisible = false;
493  if (!mEndpointNotInView.isEmpty() && !mOnlyNavigate)
494  {
495  for (Endpoint* ep : mEndpointNotInView)
496  {
497  if (addToViewItem(ep))
498  mAddToViewVisible = true;
499  }
500  }
501 
502  if (mAddToViewVisible)
503  {
504 // mAddToViewFrame->show();
505  mTabs->setTabEnabled(1,true);
506  mAddToViewWidget->expandAll();
507  mAddToViewWidget->setCurrentIndex(mAddToViewWidget->firstIndex());
508  if (!mNavigateVisible)
509  {
510  mTabs->setCurrentIndex(1);
511  mAddToViewWidget->setFocus();
512  }
513  }
514  else
515  mTabs->setTabEnabled(1,false);
516 // mAddToViewFrame->hide();
517 
518  resizeToFit();
519  }
520 
521  void GraphNavigationWidget::resizeToFit()
522  {
523  if (mNavigateVisible)
524  {
525  mNavigateWidget->resizeColumnsToContents();
526 
527  int width = 4;
528  for (int i = 0; i < mNavigateWidget->columnCount(); i++)
529  {
530  mNavigateWidget->setColumnWidth(i, sDefaultColumnWidth[i]);
531  width += sDefaultColumnWidth[i];
532  }
533  int height = 28;
534  mNavigateWidget->horizontalHeader()->setMaximumHeight(24);
535  for (int i = 0; i < mNavigateWidget->rowCount(); i++)
536  {
537  height += mNavigateWidget->verticalHeader()->sectionSize(i);
538  }
539  if (height > sMaxHeight)
540  height = sMaxHeight;
541  mNavigateWidget->setFixedSize(width, height);
542  }
543 
544  if (mAddToViewVisible)
545  {
546  int width = 4;
547  for (int i = 0; i < mAddToViewWidget->columnCount(); i++)
548  {
549  mAddToViewWidget->setColumnWidth(i, sDefaultColumnWidth[i]);
550  width += sDefaultColumnWidth[i];
551  }
552  mAddToViewWidget->setFixedWidth(width);
553  mAddToViewWidget->setMaximumHeight(sMaxHeight);
554  }
555  }
556 
558  {
559  if (ev->key() == Qt::Key_Tab)
560  {
561  toggleWidget();
562  return;
563  }
565  }
566 
568  {
569  Q_UNUSED(ev);
570  if (mNavigateVisible)
571  {
572  mNavigateWidget->setFocus();
573  mAddToViewWidget->clearSelection();
574  }
575  else if (mAddToViewVisible)
576  {
577  mAddToViewWidget->setFocus();
578  mNavigateWidget->clearSelection();
579  }
580  }
581 
582  void GraphNavigationWidget::handleNavigateSelected(int irow, int icol)
583  {
584  Q_UNUSED(icol);
585  QSet<u32> navigateGates;
586  QSet<u32> navigateModules;
587  const Node& nd = mNavigateNodes.at(irow);
588  switch (nd.type())
589  {
590  case Node::Module:
591  navigateModules.insert(nd.id());
592  break;
593  case Node::Gate:
594  navigateGates.insert(nd.id());
595  break;
596  default:
597  return;
598  }
599  Q_EMIT navigationRequested(mOrigin, mViaNet->get_id(), navigateGates, navigateModules);
600  }
601 
602  void GraphNavigationWidget::handleAddToViewSelected(QTreeWidgetItem* item, int icol)
603  {
604  Q_UNUSED(icol);
605  Q_UNUSED(item);
606  QSet<u32> addGates;
607  QSet<u32> addModules;
608 
609  for (QTreeWidgetItem* selItem : mAddToViewWidget->selectedItems())
610  {
611  Node nd = mAddToViewNodes.value(selItem);
612  switch (nd.type())
613  {
614  case Node::Module:
615  addModules.insert(nd.id());
616  break;
617  case Node::Gate:
618  addGates.insert(nd.id());
619  break;
620  default:
621  continue;
622  }
623  }
624  Q_EMIT navigationRequested(mOrigin, mViaNet->get_id(), addGates, addModules);
625  }
626 
627 } // namespace hal
ContextManagerWidget * getContextManagerWidget()
Definition: gate.h:58
GraphLayouter * getLayouter() const
const NodeBoxes & boxes() const
void keyPressEvent(QKeyEvent *event) override
void focusInEvent(QFocusEvent *event) override
void focusInEvent(QFocusEvent *event) override
void keyPressEvent(QKeyEvent *event) override
QList< QTreeWidgetItem * > selectedItems() const
SelectionRelay::Subfocus direction() const
void navigationRequested(const Node &origin, const u32 via_net, const QSet< u32 > &to_gates, const QSet< u32 > &to_modules)
void setup(SelectionRelay::Subfocus direction)
GraphNavigationWidget(bool onlyNavigate, QWidget *parent=nullptr)
void focusInEvent(QFocusEvent *event) override
void keyPressEvent(QKeyEvent *event) override
QList< u32 > inputNets() const
QList< u32 > outputNets() const
Module * get_parent_module() const
Definition: module.cpp:125
u32 get_id() const
Definition: module.cpp:82
Definition: net.h:58
u32 get_id() const
Definition: net.cpp:88
std::vector< Endpoint * > get_destinations(const std::function< bool(Endpoint *ep)> &filter=nullptr) const
Definition: net.cpp:426
std::vector< Endpoint * > get_sources(const std::function< bool(Endpoint *ep)> &filter=nullptr) const
Definition: net.cpp:264
Gate * get_gate_by_id(const u32 gate_id) const
Definition: netlist.cpp:193
Module * get_module_by_id(u32 module_id) const
Definition: netlist.cpp:613
Net * get_net_by_id(u32 net_id) const
Definition: netlist.cpp:353
The NodeBox class represents a node placed at a grid position within a hal view.
Definition: node_box.h:50
GraphicsNode * item() const
item getter for graphics item object
Definition: node_box.h:124
Node getNode() const
getNode getter for node information
Definition: node_box.h:75
Node::NodeType type() const
type getter for type information
Definition: node_box.h:81
u32 id() const
id getter for ID information
Definition: node_box.h:87
The NodeBoxes class owns all NodeBox'es from hal view.
Definition: node_box.h:150
NodeBox * boxForNode(const Node &n) const
boxForNode find NodeBox by node
Definition: node_box.h:200
The Node class object represents a module or a gate.
Definition: gui_def.h:61
NodeType type() const
type getter for type information
Definition: gui_def.h:71
@ Module
Definition: gui_def.h:63
@ Gate
Definition: gui_def.h:63
@ None
Definition: gui_def.h:63
bool isNull() const
isNull test for null-Node object typically returned from functions
Definition: gui_def.h:83
u32 id() const
id getter for ID information
Definition: gui_def.h:77
Stores and manages the gui's selection state.
ItemType focusType() const
u32 subfocusIndex() const
ContentManager * gContentManager
Definition: plugin_gui.cpp:78
SelectionRelay * gSelectionRelay
Definition: plugin_gui.cpp:83
Netlist * gNetlist
Definition: plugin_gui.cpp:80
n
Definition: test.py:6
quint32 u32
PinDirection direction
virtual void focusInEvent(QFocusEvent *event) override
virtual void keyPressEvent(QKeyEvent *event) override
void setSelectionBehavior(QAbstractItemView::SelectionBehavior behavior)
void setSelectionMode(QAbstractItemView::SelectionMode mode)
void setCurrentIndex(const QModelIndex &index)
QEvent::Type type() const const
void addWidget(QWidget *widget, int row, int column, Qt::Alignment alignment)
int sectionSize(int logicalIndex) const const
void setStretchLastSection(bool stretch)
int key() const const
void append(const T &value)
const T & at(int i) const const
int size() const const
Q_EMITQ_EMIT
QMetaObject::Connection connect(const QObject *sender, const char *signal, const QObject *receiver, const char *method, Qt::ConnectionType type)
bool contains(const T &value) const const
QSet::iterator insert(const T &value)
void activated()
QString fromStdString(const std::string &str)
bool isEmpty() const const
QString number(int n, int base)
AlignRight
Key_Enter
QHeaderView * horizontalHeader() const const
void resizeColumnsToContents()
void selectRow(int row)
void setColumnWidth(int column, int width)
void setShowGrid(bool show)
QHeaderView * verticalHeader() const const
void cellDoubleClicked(int row, int column)
void clearContents()
int currentRow() const const
virtual bool event(QEvent *e) override
void insertRow(int row)
void setColumnCount(int columns)
void setCurrentCell(int row, int column)
void setHorizontalHeaderLabels(const QStringList &labels)
void setItem(int row, int column, QTableWidgetItem *item)
void setRowCount(int rows)
void setTextAlignment(int alignment)
int addTab(QWidget *page, const QString &label)
void setTabEnabled(int index, bool enable)
void expandAll()
QHeaderView * header() const const
virtual void keyPressEvent(QKeyEvent *event) override
void setColumnWidth(int column, int width)
void addTopLevelItem(QTreeWidgetItem *item)
void clear()
void setColumnCount(int columns)
QTreeWidgetItem * currentItem() const const
virtual bool event(QEvent *e) override
QModelIndex indexFromItem(const QTreeWidgetItem *item, int column) const const
void itemDoubleClicked(QTreeWidgetItem *item, int column)
void setHeaderLabels(const QStringList &labels)
QTreeWidgetItem * topLevelItem(int index) const const
void addChild(QTreeWidgetItem *child)
QTreeWidgetItem * child(int index) const const
int childCount() const const
bool isSelected() const const
void setTextAlignment(int column, int alignment)
void setFocusPolicy(Qt::FocusPolicy policy)
void hide()
virtual void keyPressEvent(QKeyEvent *event)
void setMaximumHeight(int maxh)
void setFixedSize(const QSize &s)
void setFixedWidth(int w)
void setFocus()