首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >隐藏QLineEdit闪烁光标

隐藏QLineEdit闪烁光标
EN

Stack Overflow用户
提问于 2014-08-07 10:52:53
回答 6查看 9.5K关注 0票数 8

我正在研究Qtv5.2

我需要永久隐藏QLineEdit的闪烁光标(插入符号)。但同时,我希望QLineEdit是可编辑的(因此readOnly和/或设置可编辑的false对我来说不是一个选项)。

QLineEdit处于焦点时,我已经在更改它的背景色,所以我将知道正在编辑哪个QLineEdit小部件。对于我的要求,光标(闪烁的文本光标)显示不应该在那里。

我尝试过styleSheets,但无法获得光标隐藏的( {color:transparent; text-shadow:0px 0px 0px black;} )

有人能告诉我怎么做到这一点吗?

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2014-08-07 11:57:22

没有标准的方法可以这样做,但是您可以使用setReadOnly方法来隐藏游标。当您调用此方法时,它将禁用键的处理,因此需要强制处理。继承QLineEdit并重新实现keyPressEvent

代码语言:javascript
复制
LineEdit::LineEdit(QWidget* parent)
 : QLineEdit(parent)
{
  setReadOnly(true);      
}

void LineEdit::keyPressEvent(QKeyEvent* e)
{
  setReadOnly(false);
  __super::keyPressEvent(e);
  setReadOnly(true);
}
票数 11
EN

Stack Overflow用户

发布于 2014-08-07 12:14:39

作为解决办法,您可以创建一个单行QTextEdit,并通过setCursorWidth将光标的宽度设置为零。

对于单行QTextEdit,您应该子类QTextEdit并执行以下操作:

  1. 禁用文字包装。
  2. 禁用滚动条(AlwaysOff)。
  3. setTabChangesFocus(true)
  4. 将sizePolicy设置为(QSizePolicy::ExpandingQSizePolicy::Fixed)
  5. 重新实现keyPressEvent()以在命中Enter/Return时忽略事件
  6. 重新实现sizeHint以根据字体返回大小。

执行工作是:

代码语言:javascript
复制
#include <QTextEdit>
#include <QKeyEvent>
#include <QStyleOption>
#include <QApplication>


class TextEdit : public QTextEdit
{
public:
        TextEdit()
        {
                setTabChangesFocus(true);
                setWordWrapMode(QTextOption::NoWrap);
                setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
                setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
                setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed);
                setFixedHeight(sizeHint().height());
        }
        void keyPressEvent(QKeyEvent *event)
        {
                if (event->key() == Qt::Key_Return || event->key() == Qt::Key_Enter)
                        event->ignore();
                else
                        QTextEdit::keyPressEvent(event);
        }
        QSize sizeHint() const
        {
                QFontMetrics fm(font());
                int h = qMax(fm.height(), 14) + 4;
                int w = fm.width(QLatin1Char('x')) * 17 + 4;
                QStyleOptionFrameV2 opt;
                opt.initFrom(this);
                return (style()->sizeFromContents(QStyle::CT_LineEdit, &opt, QSize(w, h).
                        expandedTo(QApplication::globalStrut()), this));
        }
};

现在您可以创建一个TextEdit实例,并将光标宽度设置为零:

代码语言:javascript
复制
textEdit->setCursorWidth(0);
票数 3
EN

Stack Overflow用户

发布于 2021-05-26 16:41:34

我发现的最直接的东西是从这个github回购公司偷来的:https://github.com/igogo/qt5noblink/blob/master/qt5noblink.cpp

基本上,你只是想禁用内部的“眨眼计时器”Qt认为是好的UX (提示闪烁光标从来不是好的UX和永远不会-也许尝试颜色或高亮那里,呃设计窥视)。

所以代码非常简单:

代码语言:javascript
复制
from PyQt5 import QtGui


app = QtGui.QApplication.instance()
app.setCursorFlashTime(0)

哇哦。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25180628

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档