如何禁用QTextEdit中的光标?

7

我现在正在使用带有Qt虚拟键盘的QTextEdit,并且我在QTextEdit中遇到了一个问题

我想禁用QTextEdit中的文本光标。 我尝试使用

setCursorWidth(0);

文本光标消失了。但是当我使用阿拉伯语键盘时,那里会有一个小箭头在闪烁

就像这样:

enter image description here

有没有办法禁用闪烁的光标呢? 非常感谢!

2个回答

4

实际上这是一个Qt的bug,已在这里报告。作为解决方法,您可以创建一个继承自QTextEdit并重新实现keyPressEvent事件的自定义类:

class TextEdit : public QTextEdit
{
public:
    TextEdit(QWidget* parent = nullptr) : QTextEdit(parent) {
        setReadOnly(true);
    }
    void keyPressEvent(QKeyEvent* event) {
        setReadOnly(false);
        QTextEdit::keyPressEvent(event);
        setReadOnly(true);
    }
};

这也将隐藏从右到左书写语言中的光标。


嗨,Nejat,感谢您的评论。但我现在也正在使用qt虚拟键盘。我正在尝试使用虚拟键盘在QTextEdit上输入一些阿拉伯语。当我设置“setReadOnly(true)”时,似乎无法激活qt虚拟键盘。 - tako

1
一个简单的解决方案是创建一个QProxyStyle,这样所有的小部件都会受到影响,而无需继承该类。
#include <QtWidgets>

class CursorStyle: public QProxyStyle
{
public:
    using QProxyStyle::QProxyStyle;
    int pixelMetric(QStyle::PixelMetric metric, const QStyleOption *option = nullptr, const QWidget *widget = nullptr) const override
    {
        if(metric == PM_TextCursorWidth)
            return 0;
        return  QProxyStyle::pixelMetric(metric, option, widget);
    }
};


int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    CursorStyle *style = new CursorStyle(a.style());
    a.setStyle(style);
    QWidget w;
    QVBoxLayout *lay = new QVBoxLayout(&w);
    lay->addWidget(new QLineEdit);
    lay->addWidget(new QTextEdit);
    w.show();
    return a.exec();
}

你好,感谢您的评论!我认为您实现的类与 setCursorWidth(0) 做了类似的事情?(if(metric == PM_TextCursorWidth) return 0;) 然而,即使使用这个方法,我仍然可以看到闪烁的箭头。顺便说一下,我正在使用 Qt 虚拟键盘输入阿拉伯语,而不是笔记本电脑/计算机上的硬件键盘。 - tako

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接