如何在更改文本后调整QWidgetAction显示的QLabel的大小

时间:2017-02-08 20:28:27

标签: c++ qt qmenu

我使用$a = 2; $a = toBeCalled($a); echo $a //50 function toBeCalled( &$par_ref ) { $parameter = &$par_ref; $parameter = $parameter*25; } 向上下文菜单添加标题(无论使用何种样式,它都会显示在Windows上,与QWidgetAction形成对比,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);

当第一次设置标签的文本时(标签的文本设置为短文本),一切都很好:

enter image description here

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

enter image description here

我尝试解决这个问题,但我找到的唯一可行解决方案是定义构造函数中菜单中显示的QAction,由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);

有没有办法在不重建菜单的情况下调整标题大小?

3 个答案:

答案 0 :(得分:1)

解决方案是发送一个resize事件:

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()调整大小!

答案 1 :(得分:0)

此答案扩展了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类的实例,并确保ActionWidget报告正确的(更新的)大小提示。

答案 2 :(得分:0)

QResizeEvent 解决方案并不适合我(使用更复杂的小部件),我通过阅读 QMenuQAction 源代码找到了通用解决方案。

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 中需要的一切:重新计算几何图形、将菜单调整为新的大小(如果它可见)等。