Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/152.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ QT按钮文本中带下划线快捷键的工具栏_C++_Qt_User Interface_Toolbar - Fatal编程技术网

C++ QT按钮文本中带下划线快捷键的工具栏

C++ QT按钮文本中带下划线快捷键的工具栏,c++,qt,user-interface,toolbar,C++,Qt,User Interface,Toolbar,我有一个简单的Qt工具栏,带有纯文本按钮操作: MainWindow::MainWindow(QWidget* parent) : QMainWindow(parent) { QToolBar* toolBar = new QToolBar(this); QAction* action = toolBar->addAction("&Action"); QObject::connect(action, SIGNAL(triggered()), this, SLOT(

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

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

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

标准
QAction
小部件(实际上是一个
QToolButton
小部件)使用其文本的精简版本来显示:“&Menu Option…”变为“Menu Option”

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

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);
}
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;
}
main窗口中
构造函数按如下方式使用它:

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

如果在应用程序运行时按“Alt”键会怎么样?它会改变文本吗?对于我的测试申请号。为什么会改变?@vahancho是的,它会!只需按一次Alt键,即可在
A
下方加下划线,并保持下划线状态。不必使用Alt键就能完成吗?@PaulJurczak,我不知道有什么方法可以轻松完成。但你为什么需要这个?我认为,至少在Windows世界中,Alt键使快捷方式字母带下划线是常见的甚至是标准的行为。@Paul Jurczak:Windows,但我目前可以访问的机器是Qt 4.8。在细节中,它说,在windows上,人们可以更改它的设置。我没有找到它,但问题是,你是想让它成为一个依赖用户的功能,还是它应该在所有机器上都能工作。这里也一样,非常感谢!我在Qt文档中发现了一个类似的例子。如果我们有更好的搜索引擎就好了:-(