feat: 为选择井对话框添加快捷选择与移除参数界面帮助页面初始化函数

- 支持 Ctrl+A 全选井
- 支持 Ctrl+Shift+A 清空选择
- 支持 Shift+点击范围选择
- 过滤空的已选择井结果
feature/prepost-render-refactor
lh 2 weeks ago
parent f87ffafad9
commit 5741f690a7

@ -55,7 +55,20 @@ private:
QList<QVariant> 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();
};

@ -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<QString, QString> mapObjectNames /*= QMap<QString, QString>()*/)
{

@ -12,11 +12,15 @@
#include <QListWidget>
#include "nmData/nmDataLogFile.h"
#include <QTextEdit>
#include <QShortcut>
#include <QKeySequence>
#include <QApplication>
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<nmWxSelectWellItemWidget*>(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<nmWxSelectWellItemWidget*>(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<nmWxSelectWellItemWidget*>(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)

Loading…
Cancel
Save