From 5741f690a7ec0d2dd58d8d45ea65a1fee062df6f Mon Sep 17 00:00:00 2001 From: lh <2334563547@qq.com> Date: Tue, 4 Aug 2026 15:57:12 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E4=B8=BA=E9=80=89=E6=8B=A9=E4=BA=95?= =?UTF-8?q?=E5=AF=B9=E8=AF=9D=E6=A1=86=E6=B7=BB=E5=8A=A0=E5=BF=AB=E6=8D=B7?= =?UTF-8?q?=E9=80=89=E6=8B=A9=E4=B8=8E=E7=A7=BB=E9=99=A4=E5=8F=82=E6=95=B0?= =?UTF-8?q?=E7=95=8C=E9=9D=A2=E5=B8=AE=E5=8A=A9=E9=A1=B5=E9=9D=A2=E5=88=9D?= =?UTF-8?q?=E5=A7=8B=E5=8C=96=E5=87=BD=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 支持 Ctrl+A 全选井 - 支持 Ctrl+Shift+A 清空选择 - 支持 Shift+点击范围选择 - 过滤空的已选择井结果 --- .../nmNum/nmSubWxs/nmWxSelectWellsWidget.h | 13 +++ Src/nmNum/nmSubWxs/nmWxParaPropertyPebi.cpp | 11 --- Src/nmNum/nmSubWxs/nmWxSelectWellsWidget.cpp | 98 ++++++++++++++++++- 3 files changed, 109 insertions(+), 13 deletions(-) diff --git a/Include/nmNum/nmSubWxs/nmWxSelectWellsWidget.h b/Include/nmNum/nmSubWxs/nmWxSelectWellsWidget.h index 24c2621..2bdf3e5 100644 --- a/Include/nmNum/nmSubWxs/nmWxSelectWellsWidget.h +++ b/Include/nmNum/nmSubWxs/nmWxSelectWellsWidget.h @@ -55,7 +55,20 @@ private: QList m_values; // 已经被选中的items QStringList m_selectItems; + // 上次点击的井下标,用于Shift+点击范围选择 + int m_nLastClickedIndex; + // 获取指定井项在列表中的下标 + int indexOfItemWidget(nmWxSelectWellItemWidget* itemWidget) const; + // 批量设置所有井的选中状态 + void setAllItemsSelected(bool selected); + // 批量设置指定范围内井的选中状态 + void setRangeItemsSelected(int fromIndex, int toIndex, bool selected); private slots: + // 刷新右侧已选择井文本 void onUpdateSelections(); + // 全选所有井 + void onSelectAllItems(); + // 清空所有已选择井 + void onClearSelectedItems(); }; diff --git a/Src/nmNum/nmSubWxs/nmWxParaPropertyPebi.cpp b/Src/nmNum/nmSubWxs/nmWxParaPropertyPebi.cpp index 7eb051f..9c87711 100644 --- a/Src/nmNum/nmSubWxs/nmWxParaPropertyPebi.cpp +++ b/Src/nmNum/nmSubWxs/nmWxParaPropertyPebi.cpp @@ -240,7 +240,6 @@ void nmWxParaPropertyPebi::initUI() pLayoutBk->setMargin(0); pLayoutBk->addWidget(pArea); - initUI_HelpBox(); if (nullptr != m_pHelpBox) { pLayoutBk->addWidget(m_pHelpBox); @@ -250,16 +249,6 @@ void nmWxParaPropertyPebi::initUI() } } -void nmWxParaPropertyPebi::initUI_HelpBox() -{ - // Sub: HelpBox - m_pHelpBox = new QTextEdit(); - Q_ASSERT(nullptr != m_pHelpBox); - - m_pHelpBox->setMaximumHeight(_resoSizeH(65)); - m_pHelpBox->setReadOnly(true); -} - void nmWxParaPropertyPebi::refreshUIs(QStringList& listParas, bool bReserveOlds /*= true*/, QMap mapObjectNames /*= QMap()*/) { diff --git a/Src/nmNum/nmSubWxs/nmWxSelectWellsWidget.cpp b/Src/nmNum/nmSubWxs/nmWxSelectWellsWidget.cpp index d890195..294444e 100644 --- a/Src/nmNum/nmSubWxs/nmWxSelectWellsWidget.cpp +++ b/Src/nmNum/nmSubWxs/nmWxSelectWellsWidget.cpp @@ -12,11 +12,15 @@ #include #include "nmData/nmDataLogFile.h" #include +#include +#include +#include nmWxSelectWellsWidget::nmWxSelectWellsWidget(QWidget* aParent) : QWidget(aParent), m_pListWidget(new QListWidget(this)), - m_pLineEdit(new QTextEdit(this)) + m_pLineEdit(new QTextEdit(this)), + m_nLastClickedIndex(-1) { // 主布局 QGridLayout* layout = new QGridLayout; @@ -27,6 +31,15 @@ nmWxSelectWellsWidget::nmWxSelectWellsWidget(QWidget* aParent) : layout->addWidget(m_pLineEdit, 1, 1); // m_pLineEdit->setText(multiLineText); m_pLineEdit->setReadOnly(true); + // 快捷键:Ctrl+A全选,Ctrl+Shift+A清空选择 + QShortcut* selectAllShortcut = new QShortcut(QKeySequence::SelectAll, this); + selectAllShortcut->setContext(Qt::WidgetWithChildrenShortcut); + connect(selectAllShortcut, SIGNAL(activated()), this, SLOT(onSelectAllItems())); + + QShortcut* clearSelectionShortcut = new QShortcut(QKeySequence(Qt::CTRL + Qt::SHIFT + Qt::Key_A), this); + clearSelectionShortcut->setContext(Qt::WidgetWithChildrenShortcut); + connect(clearSelectionShortcut, SIGNAL(activated()), this, SLOT(onClearSelectedItems())); + this->setMinimumWidth(200); } @@ -62,7 +75,9 @@ void nmWxSelectWellsWidget::addItem(QString name, QVariant value) QStringList nmWxSelectWellsWidget::getItems() { - return m_pLineEdit->toPlainText().split("\n"); + QStringList items = m_pLineEdit->toPlainText().split("\n"); + items.removeAll(QString()); + return items; } void nmWxSelectWellsWidget::setSelectedItems(QStringList selectItems) @@ -72,6 +87,20 @@ void nmWxSelectWellsWidget::setSelectedItems(QStringList selectItems) void nmWxSelectWellsWidget::onUpdateSelections() { + // 如果由井项点击触发,则记录点击位置并处理Shift范围选择 + nmWxSelectWellItemWidget* clickedItemWidget = qobject_cast(sender()); + if (clickedItemWidget) { + const int clickedIndex = this->indexOfItemWidget(clickedItemWidget); + if (clickedIndex >= 0) { + const bool shiftPressed = QApplication::keyboardModifiers() & Qt::ShiftModifier; + if (shiftPressed && m_nLastClickedIndex >= 0 && m_nLastClickedIndex != clickedIndex) { + // Shift+点击:将上次点击项到当前项之间的井批量设置为当前选择状态 + this->setRangeItemsSelected(m_nLastClickedIndex, clickedIndex, clickedItemWidget->getSelected()); + } + m_nLastClickedIndex = clickedIndex; + } + } + QStringList nameList; // 遍历所有的itemWidget,获取所有被选中的信息 for (int i = 0; i < m_pListWidget->count(); i++) { @@ -83,6 +112,71 @@ void nmWxSelectWellsWidget::onUpdateSelections() m_pLineEdit->setPlainText(nameList.join("\n")); } +// 查找井项在列表中的位置 +int nmWxSelectWellsWidget::indexOfItemWidget(nmWxSelectWellItemWidget* itemWidget) const +{ + for (int i = 0; i < m_pListWidget->count(); i++) { + if (m_pListWidget->itemWidget(m_pListWidget->item(i)) == itemWidget) { + return i; + } + } + + return -1; +} + +// 批量设置所有井的选中状态,最后统一刷新右侧文本 +void nmWxSelectWellsWidget::setAllItemsSelected(bool selected) +{ + for (int i = 0; i < m_pListWidget->count(); i++) { + nmWxSelectWellItemWidget* itemWidget = static_cast(m_pListWidget->itemWidget(m_pListWidget->item(i))); + if (!itemWidget) { + continue; + } + + // 屏蔽单项信号,避免批量操作时重复刷新 + const bool oldSignalsBlocked = itemWidget->blockSignals(true); + itemWidget->setSelected(selected); + itemWidget->blockSignals(oldSignalsBlocked); + } + + this->onUpdateSelections(); +} + +// 批量设置指定范围内井的选中状态 +void nmWxSelectWellsWidget::setRangeItemsSelected(int fromIndex, int toIndex, bool selected) +{ + // 允许从下往上Shift+点击 + if (fromIndex > toIndex) { + const int tempIndex = fromIndex; + fromIndex = toIndex; + toIndex = tempIndex; + } + + for (int i = fromIndex; i <= toIndex && i < m_pListWidget->count(); i++) { + nmWxSelectWellItemWidget* itemWidget = static_cast(m_pListWidget->itemWidget(m_pListWidget->item(i))); + if (!itemWidget) { + continue; + } + + // 屏蔽单项信号,范围处理完成后由外层统一刷新 + const bool oldSignalsBlocked = itemWidget->blockSignals(true); + itemWidget->setSelected(selected); + itemWidget->blockSignals(oldSignalsBlocked); + } +} + +// 响应Ctrl+A,全选所有井 +void nmWxSelectWellsWidget::onSelectAllItems() +{ + this->setAllItemsSelected(true); +} + +// 响应Ctrl+Shift+A,清空所有已选择井 +void nmWxSelectWellsWidget::onClearSelectedItems() +{ + this->setAllItemsSelected(false); +} + nmWxSelectWellItemWidget::nmWxSelectWellItemWidget() : m_pCBox(NULL)