样式表可以更改 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
并检查它是否接收到焦点。根据此,您可以设置所需的样式。
我会用几行代码来解释自己:
mainwindow.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
mainwindow.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
),但不适用于QFrame
和QAbstractScrollArea
、QTextEdit
或QPlainTextEdit
等继承类(下文继续)跨度>
(cont) 真诚地说,我不知道答案 :(,但我有一个猜测。我认为是由于 QTextEdit
或 QPlainTextEdit
是小部件更复杂。我的意思是文本在或包含在其他小部件中。实际上,QTextEdit
或 QPlainTextEdit
允许用户输入富 (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 中的其他键