样式表可以更改 QPlainTextEdit 中的文本颜色吗?

Posted

技术标签:

【中文标题】样式表可以更改 QPlainTextEdit 中的文本颜色吗?【英文标题】:Can a stylesheet change text color in a QPlainTextEdit? 【发布时间】:2015-08-17 22:17:11 【问题描述】:

我在 QPlainTextEdit 上使用以下样式表

QPlainTextEdit:focus 
    color:red;

但文本颜色不会在焦点上改变。

但是,如果我使用这个:

QPlainTextEdit:focus 
    background-color: red;

它有效...

这是整个样式表:

QPlainTextEdit 
    background-color:#3a3a3a;color:#EEE;border:1px;border-style:solid;border-color:#999;


QPlainTextEdit:focus 
    background-color:#DDD;color:#111;border:1px;border-style:solid;border-color:#111;
    selection-background-color: #2222FF; selection-color:white;

当我点击 QPlainTextEdit 时,它会将其背景颜色(正确地)从 3a3a3a 更改为 #DDD,但是它不会将其文本颜色从 #EEE 更改为 #111。

【问题讨论】:

哇 Qt 现在有样式表了吗?这有点酷! @Blindy 从 Qt 4.2 开始就有它们了 :) 唉,它们在基于 Qt Quick 的现代 UI 中并不是非常有用。它们仅适用于小部件系统。 Qt Quick 用来设置控件样式的基本样式系统不使用样式表。 【参考方案1】:

我已经为您的问题找到了解决方案,并使用了QPlainTextEdit。它也适用于 QTextEdit 小部件。

这个想法是为那个QPlainTextEdit 安装一个eventFilter 并检查它是否接收到焦点。根据此,您可以设置所需的样式。

我会用几行代码来解释自己:

ma​​inwindow.h(我们在 ui 文件中有一个 QPlainTextEdit)

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QtWidgets>

#include "ui_mainwindow.h"

class MainWindow : public QMainWindow

    Q_OBJECT

public:
    MainWindow();

    Ui::MainWindow ui;

private:
    bool eventFilter(QObject * object, QEvent * event);
;

#endif

ma​​inwindow.cpp

#include <QtWidgets>

#include "mainwindow.h"

MainWindow::MainWindow()

    ui.setupUi(this);
    ui.plainTextEdit->installEventFilter(this);


bool MainWindow::eventFilter(QObject *object, QEvent *event)

    if (object == ui.plainTextEdit)
    
        if (event->type() == QEvent::FocusOut)
        
            ui.plainTextEdit->setStyleSheet("color: white; background-color: black;");
         else if (event->type() == QEvent::FocusIn) 
            ui.plainTextEdit->setStyleSheet("color: red; background-color: white;");
        
        return false;
        
    return false;

【讨论】:

顺便说一句,我试过你的代码,但它没有用,我确信没有冲突,因为这是我唯一的 QPlainTextEdit 和 QPlainTextEdits 的唯一规则 @StephenH.Anderson 我取消删除并更新了我的答案:) 我希望这会对你有所帮助。 其实你的答案很完美!但是,我很困惑,如果我们实际上应用了一个样式表,为什么它会起作用,根据 Kuba Ober 的说法,由于富文本格式而无法工作?谢谢 好吧,在您最初的问题中,您有一个QPlainTextEdit,其中颜色是通过样式表应用的。正如您几天前所说,问题出在:focus 状态。在:focus 状态下更改文本颜色适用于某些小部件(如QLineEdit),但不适用于QFrameQAbstractScrollAreaQTextEditQPlainTextEdit 等继承类(下文继续)跨度> (cont) 真诚地说,我不知道答案 :(,但我有一个猜测。我认为是由于 QTextEditQPlainTextEdit 是小部件更复杂。我的意思是文本在或包含在其他小部件中。实际上,QTextEditQPlainTextEdit 允许用户输入富 (html) 文本。可能在 :focus 状态下,color 属性无法更改 HTML 的相应代码. 或者这只是一个错误 ;)【参考方案2】:

鉴于QPlainTextEdit 显示的富文本有点违反直觉,因此没有单一的文本颜色可言。 QTextDocument是文本颜色信息的来源,文档内可以有多种颜色。

setPlainText() 是一种方便的方法,它使用纯文本创建 QTextDocument 的富文本表示形式。

QPlainTextEdit 基本上不可能使用样式的color 属性,因为没有单一的文本颜色可以更改。

【讨论】:

Kuba,谢谢,这听起来很有趣……还有其他的 TextEdit 我可以使用吗?我不需要富文本我想从我的样式表中实现效果(在 QLineEdits 上完美运行) @StephenH.Anderson 您可以设置一个动态属性的样式,比如说qproperty-color,然后在小部件上安装一个事件过滤器,通过遍历文档和更改文本来作用于QDynamicPropertyChangeEvent每个块的颜色单独。这是一个相当非侵入性的更改,允许您继续使用样式表,并且不需要对 QPlainTextEdit 进行任何子类化。 哇...这对于我试图完成的简单任务来说听起来很困难。没有一个简单的文本框可以像 QLineEdit 一样设置样式,这太疯狂了。 @StephenH.Anderson 为什么不使用QTextEdit? (顺便说一句,我删除了我的答案。没用) 我正在使用它,但也没有用。我怎样才能达到那个效果?

以上是关于样式表可以更改 QPlainTextEdit 中的文本颜色吗?的主要内容,如果未能解决你的问题,请参考以下文章

不能通过 keyPressEvent 使用 QPlainTextEdit 中的其他键

Qt QPlainTextEdit 背景

更改反应表中的列宽

是否可以更改样式为 UIAlertController 的操作表的 Y 位置?

QtreeWidget 样式表:更改所选项目样式

SharePoint - 更改主题样式表