样式表能否改变QPlainTextEdit中的文本颜色?

3
我在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
@Blindy 自Qt 4.2以来,它们就一直存在了 :) 然而,它们在基于Qt Quick的现代UI中并不是非常有用。它们仅针对小部件系统进行了实现。Qt Quick用于为控件设置样式的基本样式系统不使用样式表。 - Kuba hasn't forgotten Monica
2个回答

3
我有一个解决方案,可以使用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的规则也只有这一个。 - Stephen H. Anderson
@StephenH.Anderson 我恢复并更新了我的答案 :) 希望这能帮到你。 - Tarod
实际上,你的答案完美地解决了问题!但是,我有些困惑,为什么它能够工作,因为根据Kuba Ober的说法,我们实际上应用了一个样式表,而这个样式表由于富文本格式而无法工作?谢谢。 - Stephen H. Anderson
在你最初的问题中,你有一个QPlainTextEdit,其中颜色是通过样式表应用的。问题在于:focus状态,正如你几天前所说。更改:focus状态下的文本颜色适用于某些小部件(如QLineEdit),但不适用于QFrame和继承类,如QAbstractScrollAreaQTextEditQPlainTextEdit。(以下续) - Tarod
真诚地说,我不知道答案:(,但我有一个猜测。我认为这是由于QTextEditQPlainTextEdit是更复杂的小部件。我的意思是文本位于其他小部件内或包含在其中。实际上,QTextEditQPlainTextEdit允许用户输入富文本(HTML)。也许在:focus状态下,color属性无法更改HTML的相应代码。或者这只是一个错误;) - Tarod
听起来对我来说像是个bug。但是至少我现在把它搞定了,非常感谢你们的帮助。 - Stephen H. Anderson

1
鉴于 QPlainTextEdit 显示富文本有些令人意外,因此没有单一的文本颜色。 QTextDocument 是文本颜色信息的来源,您可以在文档中使用多种颜色。 setPlainText() 是一个方便的方法,它使用纯文本创建了一个 QTextDocument 的富文本表示形式。
由于没有单一的文本颜色可供更改,因此 QPlainTextEdit 实际上不可能使用样式的 color 属性。

Kuba,谢谢,听起来很有趣...我能用其他的TextEdit吗?我不需要richtext,我想要从我的样式表中实现效果(在QLineEdits上完美地工作)。 - Stephen H. Anderson
哇...这听起来对于我试图完成的简单任务来说很困难。真是疯狂,居然没有一个像QLineEdit一样可以样式化的简单文本框。 - Stephen H. Anderson
@StephenH.Anderson 为什么不使用 QTextEdit?(顺便说一句,我删除了我的回答。它是无用的) - Tarod
我之前试过使用它,但那也没起作用。我该如何才能用那个实现相同的效果呢? - Stephen H. Anderson
@StephenH.Anderson:“对于简单任务来说,那听起来很困难。”我们只需要几行代码就能实现。你可以试着去实现一下,然后你会发现这其实非常容易。 - Kuba hasn't forgotten Monica
显示剩余3条评论

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