#pragma once #include "global.h" // https://blog.csdn.net/MrHHHHHH/article/details/134182253 class Input : public QLineEdit { public: explicit Input(QWidget* parent = nullptr) : QLineEdit(parent) { setStyle(new Style()); setFrame(true); // 当光标的位置在文本编辑器中改变时,这个信号会被触发。old和new参数分别表示光标改变前后的位置。 connect(this, &QLineEdit::cursorPositionChanged, this, [=](int nOld, int nNew){ //qDebug().noquote() << "[" << __FILE__ << __LINE__ << "]" << "nOld :" << nOld << "nNew :" << nNew; }); // 当用户完成文本编辑(例如按下Enter键或点击其他区域使编辑结束)时,这个信号会被触发。 connect(this, &QLineEdit::editingFinished, this, [=](){ //qDebug().noquote() << "[" << __FILE__ << __LINE__ << "]" << "text :" << this->text(); }); // 当用户在文本编辑器中按下Enter键时,这个信号会被触发。 connect(this, &QLineEdit::returnPressed, this, [=](){ //qDebug().noquote() << "[" << __FILE__ << __LINE__ << "]" << "text :" << this->text(); }); // 当文本编辑器中的选区发生变化时,这个信号会被触发。例如,当用户选择或取消选择文本时。 connect(this, &QLineEdit::selectionChanged, this, [=](){ //qDebug().noquote() << "[" << __FILE__ << __LINE__ << "]" << "text :" << this->text(); }); // 当文本编辑器中的文本发生更改时,这个信号会被触发。参数text是改变后的文本内容。 connect(this, &QLineEdit::textChanged, this, [=](const QString& text){ // qDebug().noquote() << "[" << __FILE__ << __LINE__ << "]" << "text :" << text; }); // 当文本编辑器开始编辑新的文本时,这个信号会被触发。参数text是当前编辑的文本内容。 connect(this, &QLineEdit::textEdited, this, [=](const QString& text){ //qDebug().noquote() << "[" << __FILE__ << __LINE__ << "]" << "text :" << text; }); // update(); } QString unit = "MHZ"; QFont font; QPen pen; QColor focus_color = Qt::red; QColor default_color = Qt::black; protected: void paintEvent(QPaintEvent* event) override { QLineEdit::paintEvent(event); // 调用原始绘制 auto fm = QFontMetrics(font); QPainter painter(this); painter.setRenderHint(QPainter::Antialiasing, true); int w = width(); int h = height(); int pen_w = 1; if (QApplication::focusWidget() == this) { painter.setPen(QPen(focus_color, pen_w)); } else { painter.setPen(QPen(default_color, pen_w)); } painter.drawRoundedRect(rect(), h/4, h/4); painter.setPen(pen); painter.setFont(font); int unitWidth = fm.horizontalAdvance(unit); int th = fm.height(); int x = rect().right() - unitWidth - 5; // 计算单位的绘制位置 painter.drawText(x, height() / 2 + th / 2, unit); setTextMargins(0, 0, unitWidth + 4, 0); // 右边留出单位的空间 } class Style : public QProxyStyle { public: void drawPrimitive(QStyle::PrimitiveElement element, const QStyleOption* option, QPainter* painter, const QWidget* widget) const override { // 先调用默认的绘制 auto t = qobject_cast(widget); if (!t) return; static bool it = true; // QProxyStyle::drawPrimitive(element, option, painter, widget); // qDebug() << "t->hasFrame() == " << t->hasFrame(); if (it) { // QProxyStyle::drawPrimitive(element, option, painter, widget); it = false; } // 行编辑器边框 if (element == PE_PanelLineEdit) { // } // 行编辑器边框 if (element == PE_FrameLineEdit) { // qDebug() << "lineEdit drawPrimitive " << element; // qDebug() << "width " << option->rect.width(); } } void drawComplexControl(ComplexControl control, const QStyleOptionComplex* option, QPainter* painter, const QWidget* widget) const override { // auto t = qobject_cast(widget); // if (!t) return; // qDebug() << "lineEdit drawComplexControl " << control; // QProxyStyle::drawComplexControl(control, option, painter, widget); } void drawControl(ControlElement element, const QStyleOption* option, QPainter* painter, const QWidget* widget) const override { // auto t = qobject_cast(widget); // qDebug() << "lineEdit drawControl " << element; // QProxyStyle::drawControl(element, option, painter, widget); // if (!t) return; } // void drawItemText(QPainter* painter, const QRect& rect, int flags, const QPalette& pal, bool enabled, // const QString& text, QPalette::ColorRole textRole) const override { // // // } // void drawItemPixmap(QPainter* painter, const QRect& rect, int alignment, const QPixmap& pixmap) const // override { // // } QRect subElementRect(SubElement element, const QStyleOption* option, const QWidget* widget) const override { auto t = qobject_cast(widget); if (!t) { return QProxyStyle::subElementRect(element, option, widget); } // qDebug() << "lineEdit subElementRect " << element; // 这里可以自定义返回不同的 QRect 以控制子元素的大小或位置 if (element == SE_LineEditContents) { QRect rect = QProxyStyle::subElementRect(element, option, widget); // rect.adjust(5, 5, -5, -5); // 例如,让文本内容区域缩小一点 return rect; } return QProxyStyle::subElementRect(element, option, widget); } }; };