【问题标题】:Expand cursor length QLineEdit?扩展光标长度 QLineEdit?
【发布时间】:2019-02-28 19:07:59
【问题描述】:

我想取一个普通的QLineEdit,并改变光标的形状。所以像这样的子类:

class myLineEdit : public QLineEdit
{
    Q_OBJECT
signals:

public:
    explicit myLineEdit(QWidget * parent = 0)
    {

    }

protected:

};

并使光标有几个像素宽,就像 Linux 终端一样。默认情况下,指示文本位置的光标非常细。

我假设我需要覆盖paintevent() 中的某些内容? paintevent 中究竟是什么负责绘制QLineEdit() 默认的单像素闪烁线?我在文档中找不到此信息。

【问题讨论】:

    标签: c++ qt qt5 qlineedit


    【解决方案1】:

    使用 Qpr​​oxystyle:

    #include <QtWidgets>
    
    class LineEditStyle: public QProxyStyle
    {
        Q_OBJECT
        Q_PROPERTY(int cursorWidth READ cursorWidth WRITE setCursorWidth)
    public:
        using QProxyStyle::QProxyStyle;
        int cursorWidth() const{
            if(m_cursor_width < 0)
                return baseStyle()->pixelMetric(PM_TextCursorWidth);
            return pixelMetric(PM_TextCursorWidth);
        }
        void setCursorWidth(int cursorWidth){
            m_cursor_width = cursorWidth;
        }
        int pixelMetric(QStyle::PixelMetric metric, const QStyleOption *option = nullptr, const QWidget *widget = nullptr) const override
        {
            if(metric == PM_TextCursorWidth)
                if(m_cursor_width > 0)
                    return  m_cursor_width;
            return  QProxyStyle::pixelMetric(metric, option, widget);
        }
    private:
        int m_cursor_width = -1;
    };
    
    class LineEdit: public QLineEdit
    {
        Q_OBJECT
    public:
        LineEdit(QWidget *parent = nullptr):
            QLineEdit(parent)
        {
            LineEditStyle *new_style = new LineEditStyle(style());
            new_style->setCursorWidth(10);
            setStyle(new_style);
        }
    };
    
    int main(int argc, char *argv[])
    {
        QApplication a(argc, argv);
        LineEdit w;
        w.show();
        return a.exec();
    }
    #include "main.moc"
    

    【讨论】:

    • 我实际上尝试过类似的东西,但它是针对 Qt4.x 的,我正在使用 Qt5,但我会试一试并报告,谢谢。
    • @progro QProxyStyle 自 4.6(最新版本)以来仅存在于 Qt4 中,但在 Qt4 中它已经完全可用。你在用 Qt5 吗?
    • 我使用的是 Qt5.9,但无法编译 - 错误:未定义对 `vtable for LineEdit' 的引用,有什么想法吗?我尝试了清理项目并运行 qmake,还尝试删除 Q_OBJECT 宏,但这些都不起作用。有什么想法吗?
    • @progro 如果您只在 main.cpp 中使用我的代码,那么您必须在文件末尾添加 main.moc:"#include "main.moc",执行 build -&gt; run qmake 并再次编译。如果您要将其复制到另一个文件,请删除 main.moc
    • @progro 有什么反馈吗?
    猜你喜欢
    • 2014-09-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多