QtToolBar在按钮文本中带有带下划线的快捷键

时间:2015-09-15 04:35:50

标签: c++ qt user-interface toolbar

我有一个简单的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);
}

我希望A中的Action加下划线以反映其作为快捷键的作用。怎么做到这一点?

1 个答案:

答案 0 :(得分:3)

标准QAction窗口小部件(实际上是QToolButton)使用其文本的剥离版本进行显示:"& Menu Option ..."变为"菜单选项"。

您可以创建自定义QAction窗口小部件,该窗口小部件不会通过子类化QWidgetAction来使用剥离文本:

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();
}