如何使 QTextEdit 看起来已禁用

How to make a QTextEdit look disabled

在某些时候,我需要让 QTextEdit 看起来像是被禁用了。

我不反对调用 setEnabled(false),但是 QTextEdit 不再接收 QContextMenuEvent 事件(我需要一个右键单击上下文菜单可用.. ..因为这就是 QTextEdit 被用户禁用的方式,所以这就是我希望他重新启用它的方式。

我也是:

QColor mainWindowBgColor = palette().color(QPalette::Window);
// for the current widget
setStyleSheet(QString("background-color: %0").arg(mainWindowBgColor.name(QColor::HexRgb)));

这看起来不错,除非您右键单击小部件并显示它的上下文菜单:上下文菜单出现但看起来很糟糕。项目突出显示不起作用,然后所选文本几乎不可见(在灰色背景上涂成白色)。

我怎么可能:

我会尝试继承 QTextEdit 并覆盖 contextMenuEvent。在那里我会展示(exec)一个标准菜单,在改变它的样式后sheet:

#include <QTextEdit>
#include <QContextMenuEvent>
#include <QMenu>

class TextEdit : public QTextEdit
{
public:
    TextEdit(QWidget* p) : QTextEdit(p){}
protected:
    void contextMenuEvent(QContextMenuEvent * event)
    {
        QMenu * menu = createStandardContextMenu();
        menu->setStyleSheet("background-color: gray");
        menu->exec(QCursor::pos());
    }
};

在上面的例子中,我将菜单背景颜色设置为灰色,但这个例子的目的是展示一种可以覆盖菜单样式的方法sheet,以防止菜单使用继承自它的 parent.

样式 sheet 被所有 sub-widgets 继承。要使样式 sheet 仅适用于特定小部件(或一种小部件),您必须指定访问器。

例如

setStyleSheet(QString(
    "QTextEdit { background-color: %0 }"
    ).arg(mainWindowBgColor.name(QColor::HexRgb)));