106 lines
3.4 KiB
C++
106 lines
3.4 KiB
C++
#include "src/mainwindow/mainwindow.h"
|
|
#include "ElaApplication.h"
|
|
#include "src/utils/configmanager.h"
|
|
#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();
|
|
ConfigManager::instance()->loadConfig(basePath);
|
|
|
|
MainWindow w;
|
|
w.showMaximized();
|
|
return a.exec();
|
|
}
|