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)