在使用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; };
本回答被题主选为最佳回答 , 对您是否有帮助呢?解决 无用评论 打赏 举报 编辑记录
悬赏问题
- ¥100 set_link_state
- ¥15 虚幻5 UE美术毛发渲染
- ¥15 CVRP 图论 物流运输优化
- ¥15 Tableau online 嵌入ppt失败
- ¥100 支付宝网页转账系统不识别账号
- ¥15 基于单片机的靶位控制系统
- ¥15 真我手机蓝牙传输进度消息被关闭了,怎么打开?(关键词-消息通知)
- ¥15 装 pytorch 的时候出了好多问题,遇到这种情况怎么处理?
- ¥20 IOS游览器某宝手机网页版自动立即购买JavaScript脚本
- ¥15 手机接入宽带网线,如何释放宽带全部速度