首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >QMenu右对齐文本

QMenu右对齐文本
EN

Stack Overflow用户
提问于 2019-12-07 02:17:39
回答 1查看 758关注 0票数 1

我需要QMenu中的文本右对齐,而不是左对齐。

代码语言:javascript
复制
QMenu menu;
menu.setStyleSheet("QMenu{background: #2e353d; color: #bfbfbf; margin: 0px;}"
"QMenu::item{font-size: 10pt; padding: " + QString::number(6*globalDPI) + "px " + QString::number(30*globalDPI) + "px " + QString::number(6*globalDPI) + "px " + QString::number(20*globalDPI) + "px; border: 0px solid transparent; margin: 0px;}"
"QMenu::item:selected{background: #373f49; color: #fff;}");

menu.addAction("Debug Log");
menu.addAction("Website");
menu.addAction("Changelog");
menu.addAction("About");

menu.exec(myButton->mapToGlobal(QPoint(0,32*globalDPI)));

我尝试将text-align: right添加到样式表中的QMenuQMenu::item中。我已经尝试用setLayoutDirection将布局方向设置为从右到左。我已经尝试将subcontrol-position: right;添加到样式表中。什么都不起作用,菜单中的文本保持左对齐。

有什么想法吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-12-07 03:33:49

您将无法更改QMenu文本的对齐方式,因为在使用QStyle绘制QMenu时已对其进行了编码。一种解决方法是使用QProxyStyle,方法是在QStyleOptionMenuItem中传递一个空文本来进行绘制,然后绘制文本(我显示的文本绘制是有限的,因为我不会处理所有情况,例如具有多行和其他复杂选项的QMenu )。

代码语言:javascript
复制
#include <QtWidgets>
class MenuProxyStyle: public QProxyStyle{
public:
    using QProxyStyle::QProxyStyle;
    void drawControl(ControlElement element, const QStyleOption *opt, QPainter *p, const QWidget *w) const override
    {
        if(element == QStyle::CE_MenuItem){
            if(const QStyleOptionMenuItem *o = qstyleoption_cast<const QStyleOptionMenuItem *>(opt)){
                QStyleOptionMenuItem menuitem = *o;
                QString text = o->text;
                menuitem.text = "";
                QProxyStyle::drawControl(element, &menuitem, p, w);
                if(o->text.isEmpty())
                    return;
                int margin = 4;
                int text_flags = Qt::AlignVCenter | Qt::AlignRight | Qt::TextDontClip | Qt::TextSingleLine;
                p->drawText(menuitem.rect.adjusted(margin, margin, -margin, -margin),  text_flags, text);
                return;
            }
        }
        QProxyStyle::drawControl(element, opt, p, w);
    }
};
class Widget: public QWidget{
public:
    Widget(QWidget *parent=nullptr): QWidget(parent){
        setContextMenuPolicy(Qt::CustomContextMenu);
        connect(this, &QWidget::customContextMenuRequested, this, &Widget::on_customContextMenuRequested);
    }
private:
    void on_customContextMenuRequested(const QPoint &pos){
        QMenu menu;
        menu.setStyle(new MenuProxyStyle(menu.style()));
        menu.addAction("Debug Log");
        menu.addAction("Website");
        menu.addAction("Changelog");
        menu.addAction("About");
        menu.exec(mapToGlobal(pos));
    }
};

int main(int argc, char *argv[]) {
    QApplication app(argc, argv);
    Widget w;
    w.resize(640, 480);
    w.show();
    return app.exec();
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59218378

复制
相关文章

相似问题

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