2017-02-08 2 views
1

Я использую QWidgetAction, чтобы добавить заголовок в контекстное меню (которое также будет отображаться в Windows, независимо от того, какой стиль используется, в отличие от addSection(), который не всегда отображает заголовок).Как изменить размер QLabel, отображаемый QWidgetAction после изменения его текста

Виджет действия - 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 s отображается в меню в конструкторе, принадлежащий 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); 

есть ли способ изменить размер заголовка без каждый раз перестраивая меню?

+0

QWidgetAction не имеет размера. Вам нужно изменить вопрос? Я бы хотел увидеть больше кода для этого. – AlexanderVX

+0

Я добавил код настройки меню и вызова меню. Речь идет о ширине дисплеев QLabel QWidgetAction и ширине QMenu, которая остается неизменной после того, как текст QLabel установлен в первый раз. –

+0

Ответ может быть выстрелом в темноте, но подобное решение сработало для меня один раз. – AlexanderVX

ответ

1

Решение отправить событие изменения размера вместо:

m_menuTitle->setText(tr("%1 „%2“").arg(some_variable, some_other_variable)); 
... 
QResizeEvent re(new_size, m_contextMenu->size()); 
qApp->sendEvent(m_contextMenu, &re); 

Это установит внутренний itemsDirty флаг QMenu и заставит геометрии перерасчета, когда отображается меню. Обратите внимание, что новый размер в событии не имеет значения, так как меню изменит размер на основе его sizeHint()!

+0

Вот и все! Благодаря :-) –

Смежные вопросы