【问题标题】:QtToolBar with underlined shortcut key in button textQtToolBar 在按钮文本中带有带下划线的快捷键
【发布时间】:2015-09-15 04:35:49
【问题描述】:

我有一个简单的 Qt 工具栏,带有纯文本按钮 Action

MainWindow::MainWindow(QWidget* parent) : QMainWindow(parent)
{
  QToolBar* toolBar = new QToolBar(this);
  QAction*  action  = toolBar->addAction("&Action");

  QObject::connect(action, SIGNAL(triggered()), this, SLOT(onAction()));
  action->setShortcut(QKeySequence("ctrl+a"));
  addToolBar(toolBar);
}

我想让Action 中的A 加下划线,以反映其作为快捷键的作用。如何做到这一点?

【问题讨论】:

  • 如果您在应用程序运行时按下“Alt”键会怎样?它会改变文本吗?
  • 对于我的测试申请号。为什么要这样做?
  • @vahancho 是的,确实如此!单次 Alt 按下下划线 A 并保持下划线。不用Alt键也能做到吗?
  • @PaulJurczak,我不知道有什么方法可以轻松实现。但是你为什么需要那个?我认为至少在 Windows 世界中,Alt 键使快捷键字母加下划线是常见甚至标准的行为。
  • @Paul Jurczak:Windows,但在我目前可以访问的机器上是 Qt 4.8。在QShortCut 的详细信息中,它说,在 Windows 上,可以更改它的设置。我没有找到它,但问题是,您是否希望它成为依赖于用户的功能,或者它是否应该适用于所有机器。

标签: c++ qt user-interface toolbar


【解决方案1】:

标准QAction 小部件(实际上是QToolButton)使用其文本的剥离版本进行显示:“&Menu Option...”变为“Menu Option”。

您可以通过继承QWidgetAction 来创建不使用剥离文本的自定义QAction 小部件:

MyAction::MyAction(QObject *parent) :
    QWidgetAction(parent)
{
}

QWidget* MyAction::createWidget(QWidget *parent)
{
    QToolButton *tb = new QToolButton(parent);
    tb->setDefaultAction(this);
    tb->setText(this->text());// override text stripping
    tb->setFocusPolicy(Qt::NoFocus);

    return tb;
}

在您的MainWindow 构造函数中按如下方式使用它:

MainWindow(QWidget* parent=0) : QMainWindow(parent)
{
    QToolBar* toolBar = new QToolBar(this);
    MyAction* action = new MyAction();
    action->setText("&Action");
    action->setShortcut(QKeySequence(tr("ctrl+a","Action")));
    toolBar->addAction(action);

    QObject::connect(action, SIGNAL(triggered()), this, SLOT(onAction()));
    addToolBar(toolBar);
}

下划线快捷字母的外观取决于您的应用程序风格。 以下是强制显示快捷方式下划线的自定义样式示例:

class MyStyle : public QProxyStyle
{
public:
    MyStyle();

    int styleHint(StyleHint hint,
                  const QStyleOption *option,
                  const QWidget *widget,
                  QStyleHintReturn *returnData) const;
};

int MyStyle::styleHint(QStyle::StyleHint hint,
                   const QStyleOption *option,
                   const QWidget *widget,
                   QStyleHintReturn *returnData) const
{
    if (hint == QStyle::SH_UnderlineShortcut)
    {
        return 1;
    }

    return QProxyStyle::styleHint(hint, option, widget, returnData);
}

那么您应该为您的应用程序设置该样式:

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    a.setStyle(new MyStyle);
    Widget w;
    w.show();

    return a.exec();
}

【讨论】:

  • 这里也一样,非常感谢!我在 Qt 文档QProxyStyle Class 中找到了一个类似的例子。如果我们有更好的搜索引擎就好了:-(
猜你喜欢
  • 2012-04-03
  • 2011-02-08
  • 1970-01-01
  • 2017-04-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-25
  • 2016-03-13
相关资源
最近更新 更多