新增代码检索功能、提升业务转码效率等
This commit is contained in:
@@ -4,11 +4,96 @@
|
||||
#include <QApplication>
|
||||
#include <QIcon>
|
||||
#include <QCoreApplication>
|
||||
#include <QEvent>
|
||||
#include <QKeyEvent>
|
||||
#include <QClipboard>
|
||||
#include <QKeySequence>
|
||||
#include <QLabel>
|
||||
#include <QAbstractItemView>
|
||||
#include <QModelIndex>
|
||||
#include <algorithm>
|
||||
|
||||
// 全局文字可复制过滤器:
|
||||
// 1) 所有 QLabel(含 ElaText)文字可用鼠标选中并复制;
|
||||
// 2) 表格/树(QAbstractItemView)选中的单元格支持 Ctrl+C 复制,制表符分隔列、换行分隔行。
|
||||
class TextSelectableFilter : public QObject
|
||||
{
|
||||
public:
|
||||
using QObject::QObject;
|
||||
|
||||
protected:
|
||||
bool eventFilter(QObject *watched, QEvent *event) override
|
||||
{
|
||||
if (event->type() == QEvent::Polish) {
|
||||
if (QLabel *label = qobject_cast<QLabel *>(watched)) {
|
||||
// 跳过用作图标按钮的 QLabel(有 pixmap 无文本),
|
||||
// 否则会被强制设为竖线(IBeamCursor),影响点击类图标控件
|
||||
if (label->pixmap().isNull()) {
|
||||
label->setTextInteractionFlags(label->textInteractionFlags()
|
||||
| Qt::TextSelectableByMouse);
|
||||
label->setCursor(Qt::IBeamCursor);
|
||||
}
|
||||
}
|
||||
} else if (event->type() == QEvent::KeyPress) {
|
||||
if (auto *view = qobject_cast<QAbstractItemView *>(watched)) {
|
||||
auto *ke = static_cast<QKeyEvent *>(event);
|
||||
if (ke->matches(QKeySequence::Copy)) {
|
||||
return copySelectedCells(view);
|
||||
}
|
||||
}
|
||||
}
|
||||
return QObject::eventFilter(watched, event);
|
||||
}
|
||||
|
||||
private:
|
||||
static bool copySelectedCells(QAbstractItemView *view)
|
||||
{
|
||||
if (!view->selectionModel()) {
|
||||
return false;
|
||||
}
|
||||
QModelIndexList idxs = view->selectionModel()->selectedIndexes();
|
||||
if (idxs.isEmpty()) {
|
||||
return false;
|
||||
}
|
||||
// 按行、列排序,保证复制顺序与显示一致
|
||||
std::sort(idxs.begin(), idxs.end(),
|
||||
[](const QModelIndex &a, const QModelIndex &b) {
|
||||
if (a.row() != b.row()) {
|
||||
return a.row() < b.row();
|
||||
}
|
||||
return a.column() < b.column();
|
||||
});
|
||||
|
||||
QString text;
|
||||
int lastRow = -1;
|
||||
for (const QModelIndex &idx : idxs) {
|
||||
if (idx.row() != lastRow) {
|
||||
if (lastRow != -1) {
|
||||
text += QLatin1Char('\n');
|
||||
}
|
||||
lastRow = idx.row();
|
||||
} else {
|
||||
text += QLatin1Char('\t');
|
||||
}
|
||||
text += idx.data(Qt::DisplayRole).toString();
|
||||
}
|
||||
if (!text.isEmpty()) {
|
||||
QApplication::clipboard()->setText(text);
|
||||
return true; // 已处理,消费该事件
|
||||
}
|
||||
return false;
|
||||
}
|
||||
};
|
||||
|
||||
int main(int argc, char *argv[])
|
||||
{
|
||||
QApplication a(argc, argv);
|
||||
a.setWindowIcon(QIcon(":resources/images/ChangeCode.png"));
|
||||
|
||||
// 安装全局过滤器:所有页面文字 / 表格树单元格允许用户复制
|
||||
TextSelectableFilter textSelectableFilter;
|
||||
a.installEventFilter(&textSelectableFilter);
|
||||
|
||||
eApp->init();
|
||||
|
||||
QString basePath = QCoreApplication::applicationDirPath();
|
||||
@@ -17,4 +102,4 @@ int main(int argc, char *argv[])
|
||||
MainWindow w;
|
||||
w.showMaximized();
|
||||
return a.exec();
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user