GrabBag/Tools/SpinBoxPasteHelper.h

72 lines
2.0 KiB
C
Raw Normal View History

2026-02-21 00:28:04 +08:00
#ifndef SPINBOX_PASTE_HELPER_H
#define SPINBOX_PASTE_HELPER_H
#include <QObject>
#include <QEvent>
#include <QKeyEvent>
#include <QApplication>
#include <QClipboard>
#include <QSpinBox>
#include <QDoubleSpinBox>
#include <QAbstractSpinBox>
/**
* @brief SpinBox
* QSpinBox/QDoubleSpinBox prefix
* Ctrl+V setValue
*
* setupUI() SpinBoxPasteHelper::install(this);
*/
class SpinBoxPasteFilter : public QObject
{
public:
explicit SpinBoxPasteFilter(QObject* parent = nullptr) : QObject(parent) {}
bool eventFilter(QObject* obj, QEvent* event) override
{
if (event->type() != QEvent::KeyPress) {
return QObject::eventFilter(obj, event);
}
QKeyEvent* keyEvent = static_cast<QKeyEvent*>(event);
if (!keyEvent->matches(QKeySequence::Paste)) {
return QObject::eventFilter(obj, event);
}
QString clipText = QApplication::clipboard()->text().trimmed();
bool ok = false;
if (QDoubleSpinBox* dsb = qobject_cast<QDoubleSpinBox*>(obj)) {
double val = clipText.toDouble(&ok);
if (ok) {
dsb->setValue(val);
return true;
}
} else if (QSpinBox* sb = qobject_cast<QSpinBox*>(obj)) {
int val = clipText.toInt(&ok);
if (ok) {
sb->setValue(val);
return true;
}
}
return QObject::eventFilter(obj, event);
}
};
namespace SpinBoxPasteHelper
{
/**
* @brief parent QSpinBox/QDoubleSpinBox
*/
inline void install(QWidget* parent)
{
SpinBoxPasteFilter* filter = new SpinBoxPasteFilter(parent);
for (QAbstractSpinBox* sb : parent->findChildren<QAbstractSpinBox*>()) {
sb->installEventFilter(filter);
}
}
}
#endif // SPINBOX_PASTE_HELPER_H