我使用QWidgetAction将标题添加到上下文菜单(无论使用什么样式,也会在Windows上显示标题,而不总是显示标题的addSection() )。
操作的小部件是一个QLabel。它的文本被上下文菜单的每次调用所改变。菜单是在类的构造函数中设置的,QWidgetAction是这样添加的(所有m_变量都是标头中声明的成员变量):
m_contextMenu = new QMenu(this);
m_menuTitle = new QLabel;
m_menuTitle->setAlignment(Qt::AlignCenter);
m_menuTitle->setMargin(4);
QWidgetAction *titleAction = new QWidgetAction(m_contextMenu);
titleAction->setDefaultWidget(m_menuTitle);
m_contextMenu->addAction(titleAction);
m_contextMenu->addSeparator();当请求菜单时,标签的文本被更改,菜单显示如下:
m_menuTitle->setText(tr("%1 „%2“").arg(some_variable, some_other_variable));
...
m_contextMenu->exec(place_to_display);当标签的文本第一次被设置时(标签的文本设置为短文本),一切都很好:

但是,当设置为更长的文本时,大小保持不变,文本将被裁剪:

我试图修复这个问题,但我找到的唯一有效解决方案是定义this拥有的构造函数中菜单中显示的this,设置标签文本,清除菜单并再次添加操作,如下所示:
m_contextMenu->clear();
m_menuTitle->setText(tr("%1 „%2“").arg(some_variable, some_other_variable));
m_contextMenu->addAction(m_menuTitleAction);
m_contextMenu->addSeparator();
m_contextMenu->addAction(m_editAction);
m_contextMenu->addAction(m_deleteAction);
m_contextMenu->exec(place_to_display);是否有一种方法可以调整标题的大小,而不必每次重新生成菜单?
发布于 2017-12-09 12:29:18
解决方案是发送一个调整大小的事件,而不是:
m_menuTitle->setText(tr("%1 „%2“").arg(some_variable, some_other_variable));
...
QResizeEvent re(new_size, m_contextMenu->size());
qApp->sendEvent(m_contextMenu, &re);这将设置QMenu的内部itemsDirty标志,并在显示菜单时强制几何重新计算。请注意,事件中的新大小并不重要,因为菜单将根据其sizeHint()__随时调整大小!
发布于 2021-02-12 07:44:42
QResizeEvent解决方案并不适用于我(使用更复杂的小部件),我通过阅读QMenu和QAction源代码找到了通用解决方案。
m_widget->installEventFilter(this);
// and in my case m_widget->layout()->setSizeConstraint(QLayout::SetFixedSize);
bool SomeClass::eventFilter(QObject* watched, QEvent* event)
{
if (watched == m_widget && event->type() == QEvent::Resize) {
// Force QMenu to recalculate the geometry of this item
QActionEvent e(QEvent::ActionChanged, this);
qApp->sendEvent(m_contextMenu, &e);
}
...
}QActionEvent触发我们在QMenu中需要的一切:重新计算几何图形,将菜单调整到新大小(如果它是可见的)等等。
发布于 2019-10-05 00:04:39
这个答案扩展了user362515's answer。
如果您更改隐藏小部件操作的大小(例如,因为它的菜单当前正在折叠),所需的工作就不多了。创建一个新的类ActionWidget,它公开地从QWidget派生。然后重写showEvent方法并按如下方式实现:
void ActionWidget::showEvent(QShowEvent* event)
{
QResizeEvent resize_event(QSize(), parentWidget()->size());
parentWidget()->adjustSize();
qApp->sendEvent(parentWidget(), &resize_event);
QWidget::showEvent(event);
}注意,必须在操作小部件的父小部件上调用adjustSize,并且必须将事件发送到父小部件。
当然,您还必须重新实现QWidgetAction::createWidget,以便它返回ActionWidget-class的一个实例,并确保ActionWidget报告一个适当的(更新)大小提示。
https://stackoverflow.com/questions/42122985
复制相似问题