厦门网络建站公司,企业网站开发有哪些,建设银行南通通州支行网站,建设项目水资源论证网站事情是这样的#xff0c;要在一个ComboBox中通过树形结构进行内容的选择。
默认的QComboBox展开是下拉的列表。因此需要定制一下。 效果就是这样的 实现上面效果的核心代码就是下面这样的
MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) { treenew…事情是这样的要在一个ComboBox中通过树形结构进行内容的选择。
默认的QComboBox展开是下拉的列表。因此需要定制一下。 效果就是这样的 实现上面效果的核心代码就是下面这样的
MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) { treenew QTreeWidget(this); auto* topnew QTreeWidgetItem({A}); tree-addTopLevelItem(top); auto* childnew QTreeWidgetItem(top,{A1}); new QTreeWidgetItem(top,{A2}); new QTreeWidgetItem(top,{A3}); new QTreeWidgetItem(child,{AA1}); new QTreeWidgetItem(child,{AA2}); topnew QTreeWidgetItem({B}); tree-addTopLevelItem(top); childnew QTreeWidgetItem(top,{B1}); new QTreeWidgetItem(top,{B2}); new QTreeWidgetItem(top,{B3}); new QTreeWidgetItem(child,{BB1}); new QTreeWidgetItem(child,{BB2}); cbxnew QComboBox(this); cbx-setEditable(true); cbx-setModel(tree-model()); cbx-setView(tree); tree-expandAll(); this-setCentralWidget(cbx);
}
现在有一个问题
点击树中的任何item树都会收起来然后关闭掉。
这不是想要的效果想要的效果是点击树中的非最底层节点树的层级会相应的收起来或者展开。而点击最底层的节点则选中相应的item收起来。
一个实现方法是通过事件处理来解决
MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) { treenew QTreeWidget(this); cbxnew QComboBox(this); cbx-setEditable(true); auto* topnew QTreeWidgetItem({A}); tree-addTopLevelItem(top); auto* childnew QTreeWidgetItem(top,{A1}); new QTreeWidgetItem(top,{A2}); new QTreeWidgetItem(top,{A3}); new QTreeWidgetItem(child,{AA1}); new QTreeWidgetItem(child,{AA2}); topnew QTreeWidgetItem({B}); tree-addTopLevelItem(top); childnew QTreeWidgetItem(top,{B1}); new QTreeWidgetItem(top,{B2}); new QTreeWidgetItem(top,{B3}); new QTreeWidgetItem(child,{BB1}); new QTreeWidgetItem(child,{BB2}); //在这里设置时无法过滤MouseButtonRelease事件 // tree-viewport()-installEventFilter(this); cbx-setModel(tree-model()); cbx-setView(tree); tree-expandAll(); //在这里设置时可以过滤MouseButtonRelease事件 tree-viewport()-installEventFilter(this); this-setCentralWidget(cbx);
}
bool MainWindow::eventFilter(QObject *watched, QEvent *event) { if(watchedtree-viewport()) { qDebug()event of tree; qDebug()event:event; if(event-type()QEvent::MouseButtonPress) return true; if(event-type()QEvent::MouseButtonRelease) { qDebug()event of tree MouseButtonRelease; QMouseEvent* eestatic_castQMouseEvent*(event); QModelIndex indextree-indexAt(ee-pos()); if(!index.isValid()) return false; QTreeWidgetItem* item static_castQTreeWidgetItem*(index.internalPointer()); if(item-childCount()!0) { if(tree-isExpanded(index)) { tree-collapse(index); } else tree-expand(index); } else { qDebug()item selected::item-text(0); // cbx-setEditText(item-text(0)); cbx-setCurrentText(item-text(0)); cbx-hidePopup(); } return true; } } return QObject::eventFilter(watched,event); }
其中下面这句代码目的是实现点击树的下拉三角时不响应两次响应两次将导致一次点击打开又关闭 if(event-type()QEvent::MouseButtonPress) return true; 软件产品展示