2015-02-14 2 views
0

Я использую несколько QToolButton s в пользовательском QGridLayout виджетах. Кнопки установлены для отображения значка + текста на основе назначенного по умолчанию QAction. Единственная проблема заключается в том, что содержимое (значок + текст) всегда выравнивается по левому краю.QToolButton с иконкой + текст: как центрировать оба?

Содержание (значок + текст, отмеченный как красное окно на снимке экрана), должен находиться в центре кнопки (обозначается синим полем).

enter image description here

В большинстве случаев это просто отлично, учитывая, что Qt автоматически пытается вынести эту кнопку с минимальным размером. Однако я растягиваю кнопку, чтобы хорошо вписаться в QGridLayout.

QToolButton* pButton = new QToolButton(0); 
pButton->addDefaultAction(pAction); 
pButton->setToolButtonStyle(Qt::ToolButtonTextBesideIcon); 
pButton->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Preferred); 

QGridLayout *pActionAreaLayout = new QGridLayout; 
pActionAreaLayout->addWidget(pSomeOtherWidget, 0, 0, 1, 2); 
pActionAreaLayout->addWidget(pButton , 1, 0, 1, 1); 

Есть ли способ заставить контент быть центрированным в кнопке?

PS: Я нашел следующий комментарий в another forum, который, однако, кажется, довольно агрессивен и на самом деле не ясно мне еще:

Вы можете попробовать сделать горизонтальное выравнивание с помощью таблицы стилей, но вы, вероятно, должны реализовать прокси QStyle и переопределить drawControl() для QStyle :: CE_ToolButtonLabel Или получить из QToolButton, перезаписать paintEvent() и вызвать стиль для всего, кроме метки.

+0

Пожалуйста отправьте соответствующий код. – user2672165

+0

@ user2672165: Я редактировал в коде в вопрос. Не уверен, что это помогает, хотя в этом случае ... –

+0

Как насчет использования выравнивания в 'void QGridLayout :: addWidget (QWidget * widget, int row, int column, Qt :: Alignment alignment = 0)'? Также вы можете опубликовать изображение о том, как он выглядит и как вы хотите, чтобы он выглядел, потому что есть несколько параметров для рассмотрения? – user2672165

ответ

2

Как я предлагаю в ответ вам еще один вопрос. https://stackoverflow.com/a/28630318/1917249 Не используйте QToolButton, просто используйте QPushButton и при необходимости добавьте всплывающее меню.

Тогда вы не будете иметь разные размеры QToolButton и QPushButton виджетов. И у вас будет центрированный значок и текст.

POPUPMENU могут быть легко добавлены в QPushButton (только маленькая стрелка обыкновение быть показан)

QPushButton *pushButton = new QPushButton(toolAction->icon(), "PushButton", window); 
// window - widget where button is placed (to get correct QMenu position) 
QObject::connect(pushButton, &QPushButton::released, [window, pushButton, action](){ 
    QMenu menu; 
    menu.addAction(action); 
    QPoint pos = window->mapToGlobal(pushButton3->pos()); 
    pos += QPoint(0, pushButton->height()); 
    menu.exec(pos); 
}); 

Или вы можете создать подкласс QPushButton и добавить Всплывающее меню обработки там. Гораздо лучше, чем попытаться центр текста с иконкой в ​​QToolButton или иметь в одном размере QPushButton и QToolButton

Для сложного примера можно найти мой ответ: https://stackoverflow.com/a/28630318/1917249

+1

Основанием для попытки QToolButton в отличие от QPushButton было то, что QToolButton автоматически берет на себя атрибуты действия (заголовок текста + значок) и обрабатывает связь с сигналом/слотом. Но в конечном итоге эти преимущества не стоят проблем и недостатков, которые я испытывал с точки зрения высоты кнопок и выравнивания текста/значка. Поэтому я переключился на QPushButton и вручную установил атрибут text/icon и установил привязку слотов/сигналов. –

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