在使用Qtreewidget并创建几个项之后,如果单击项后按住鼠标,项的选择会滑动,如何设置不滑动,在第一次单击后就确定选择
1条回答 默认 最新
- m0_54204465 2023-01-16 11:54关注
可以在QTreeWidget的构造函数中使用setSelectionMode()函数设置选择模式。 例如:
treeWidget->setSelectionMode(QAbstractItemView::SingleSelection);
这样就可以设置为只能单选了。以下根据题主的反馈重新修改答案:
思路一:可以使用setSelectionMode(QAbstractItemView::NoSelection)禁止选择,然后自定义单击事件来确定选择。#include <QtWidgets> int main(int argc, char *argv[]) { QApplication a(argc, argv); QTreeWidget treeWidget; treeWidget.setSelectionMode(QAbstractItemView::NoSelection); treeWidget.header()->setVisible(false); treeWidget.setRootIsDecorated(false); for (int i = 0; i < 5; ++i) { QTreeWidgetItem *item = new QTreeWidgetItem(&treeWidget); item->setText(0, QString("Item %1").arg(i + 1)); } treeWidget.connect(&treeWidget, &QTreeWidget::itemClicked, [&treeWidget](QTreeWidgetItem *item, int column) { treeWidget.clearSelection(); item->setSelected(true); }); treeWidget.show(); return a.exec(); }
思路二:可以使用信号/槽机制,在项单击时连接信号,设置选择,然后在信号处理函数中禁止选择。
#include <QApplication> #include <QTreeWidget> #include <QTreeWidgetItem> int main(int argc, char *argv[]) { QApplication a(argc, argv); QTreeWidget treeWidget; treeWidget.setSelectionMode(QAbstractItemView::NoSelection); treeWidget.setWindowTitle("QTreeWidget Example"); // 创建项 QTreeWidgetItem *item1 = new QTreeWidgetItem(&treeWidget); item1->setText(0, "Item 1"); QTreeWidgetItem *item2 = new QTreeWidgetItem(&treeWidget); item2->setText(0, "Item 2"); QTreeWidgetItem *item3 = new QTreeWidgetItem(&treeWidget); item3->setText(0, "Item 3"); // 信号/槽连接 QObject::connect(&treeWidget, &QTreeWidget::itemClicked, &treeWidget, [&treeWidget](QTreeWidgetItem *item) { treeWidget.setCurrentItem(item); treeWidget.setSelectionMode(QAbstractItemView::NoSelection); }); treeWidget.show(); return a.exec(); }
也可以
#include <QtWidgets> int main(int argc, char *argv[]) { QApplication a(argc, argv); QTreeWidget treeWidget; treeWidget.setSelectionMode(QAbstractItemView::SingleSelection); treeWidget.setSelectionBehavior(QAbstractItemView::SelectItems); QObject::connect(&treeWidget, &QTreeWidget::itemClicked, [&treeWidget](QTreeWidgetItem *item, int column){ treeWidget.setCurrentItem(item, column, QItemSelectionModel::Select); treeWidget.setSelectionMode(QAbstractItemView::NoSelection); }); treeWidget.show(); return a.exec(); }
这个代码设置了QTreeWidget的选择模式为单选,选择行为为选择项,并在项单击时连接信号,设置选择,然后在信号处理函数中禁止选择。
补充:可以使用自定义事件处理来实现,在鼠标按下时记录选择的项,在鼠标释放时判断是否与记录的项相同,如果不同则不选择。
#include <QListWidget> #include <QMouseEvent> class CustomListWidget : public QListWidget { Q_OBJECT public: CustomListWidget(QWidget *parent = nullptr) : QListWidget(parent) { setSelectionMode(QAbstractItemView::SingleSelection); } protected: void mousePressEvent(QMouseEvent *event) { m_selectedItem = itemAt(event->pos()); QListWidget::mousePressEvent(event); } void mouseReleaseEvent(QMouseEvent *event) { if (itemAt(event->pos()) != m_selectedItem) clearSelection(); QListWidget::mouseReleaseEvent(event); } private: QListWidgetItem *m_selectedItem; };
本回答被题主选为最佳回答 , 对您是否有帮助呢?解决 无用评论 打赏 举报 编辑记录
悬赏问题
- ¥15 linux驱动,linux应用,多线程
- ¥20 我要一个分身加定位两个功能的安卓app
- ¥15 基于FOC驱动器,如何实现卡丁车下坡无阻力的遛坡的效果
- ¥15 IAR程序莫名变量多重定义
- ¥15 (标签-UDP|关键词-client)
- ¥15 关于库卡officelite无法与虚拟机通讯的问题
- ¥15 目标检测项目无法读取视频
- ¥15 GEO datasets中基因芯片数据仅仅提供了normalized signal如何进行差异分析
- ¥100 求采集电商背景音乐的方法
- ¥15 数学建模竞赛求指导帮助