我使用QActions
将QToolBar
添加到addAction()
。
我希望工具栏按钮工具提示显示快捷方式。例如复制(Ctrl + C)。 当然,我可以静态设置
action->setTooltip(QString("%1 (%2)").arg(action.toolTip(), action->shortcut().toString(QKeySequence::NativeText)));
然而,这非常麻烦,因为有很多动作,用户可以修改快捷方式,以便我必须跟踪并相应地更新。如果我可以通过子类化QToolBar
类似于http://doc.qt.io/qt-5/qtwidgets-widgets-tooltips-example.html来简单地修改QToolBar
工具提示行为,那就更好了。
不幸的是,事情并非如此简单。工具提示不是由QToolBar
本身生成的,而是由使用QToolButton
时在内部创建的addAction()
生成的。理想情况下,我会注入我自己的QToolButton
子类。但这似乎是不可能的,因为工具按钮的实际实例化是在我无法访问的私有QToolBarLayout内完成的。
任何想法如何解决这个问题?
答案 0 :(得分:2)
我无法通过继承QToolBar
或任何相关的东西来找到解决方案。因此,我试图覆盖QAction
的工具提示。这就是它最终的样子:
我编写了添加/删除shorcut信息的函数,以便更改是可逆的(例如,如果行为应该是可切换的,则需要)。如果不需要删除,可以简化addShortcutToToolTip()
。
/* guesses a descriptive text from a text suited for a menu entry
This is equivalent to QActions internal qt_strippedText()
*/
static QString strippedActionText(QString s) {
s.remove( QString::fromLatin1("...") );
for (int i = 0; i < s.size(); ++i) {
if (s.at(i) == QLatin1Char('&'))
s.remove(i, 1);
}
return s.trimmed();
}
/* Adds possible shortcut information to the tooltip of the action.
This provides consistent behavior both with default and custom tooltips
when used in combination with removeShortcutToToolTip()
*/
void addShortcutToToolTip(QAction *action)
{
if (!action->shortcut().isEmpty()) {
QString tooltip = action->property("tooltipBackup").toString();
if (tooltip.isEmpty()) {
tooltip = action->toolTip();
if (tooltip != strippedActionText(action->text())) {
action->setProperty("tooltipBackup", action->toolTip()); // action uses a custom tooltip. Backup so that we can restore it later.
}
}
QColor shortcutTextColor = QApplication::palette().color(QPalette::ToolTipText);
QString shortCutTextColorName;
if (shortcutTextColor.value() == 0) {
shortCutTextColorName = "gray"; // special handling for black because lighter() does not work there [QTBUG-9343].
} else {
int factor = (shortcutTextColor.value() < 128) ? 150 : 50;
shortCutTextColorName = shortcutTextColor.lighter(factor).name();
}
action->setToolTip(QString("<p style='white-space:pre'>%1 <code style='color:%2; font-size:small'>%3</code></p>")
.arg(tooltip, shortCutTextColorName, action->shortcut().toString(QKeySequence::NativeText)));
}
}
/* Removes possible shortcut information from the tooltip of the action.
This provides consistent behavior both with default and custom tooltips
when used in combination with addShortcutToToolTip()
*/
void removeShortcutFromToolTip(QAction *action)
{
action->setToolTip(action->property("tooltipBackup").toString());
action->setProperty("tooltipBackup", QVariant());
}