QToolButton с текстом: перезаписать минимальную высоту на минимальную обычную высоту кнопки

Я показываю QToolButton со значком и текстом (Qt::ToolButtonTextBesideIcon) вне панели инструментов. Каждая кнопка имеет связанное с ней действие QAction, которое определяет используемый значок и отображаемый текст. Все эти кнопки размещены внутри QGridLayout. Все идет нормально.

К сожалению, похоже, что как только вы добавите QAction в QToolButton, Qt автоматически решит уменьшить его до минимального размера, чего я не хочу, учитывая мой QGridLayout. Я использовал следующие строки, чтобы исправить это поведение в горизонтальном измерении:

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

Однако моя кнопка по-прежнему имеет меньшую высоту, чем обычная (нажимная) кнопка. Я уже безуспешно пробовал различные политики других размеров.

Как лучше решить этот вопрос? Есть ли надежный способ определить «нормальную» высоту кнопки?

Одна из идей, которые у меня были, заключалась в том, чтобы создать обычную фиктивную кнопку, поместить ее в тот же макет, а затем прочитать ее размер. Затем этот размер можно было бы применить к моему QToolButton, и фиктивная кнопка снова была бы уничтожена. Есть ли более элегантный/надежный способ?


person Philip Allgaier    schedule 14.02.2015    source источник


Ответы (1)


Я не понимаю, чего вы хотите добиться.

Разница между QPushButton и QToolButton заключается в том, что QToolButton реализовал PopupMenu (можно легко сделать и для QPushButton). Как я понимаю, визуальная разница заключается только в маленькой стрелке в правом нижнем углу QToolButton, когда вы используете добавленные QActions к QToolButton

Эта стрелка для меня единственная разница между QToolButton и QPushButton. Но, возможно, я что-то упускаю.

Из ваших примеров ( QToolButton со значком + текст: как центрировать оба? ) не похоже, что вы хотите использовать это функция всплывающих окон. Вот почему я не понимаю, зачем использовать QToolButton вместо QPushButtons.

В этом примере показано: 1) Одинаковая высота QToolButton и QPushButton 2) PopuMenu для QPushButton

Что касается меня, я не понимаю, зачем использовать QToolButton и пытаться сделать его похожим на QPushButton, когда просто использовать QPushButton как QToolButton

#include <QtGui>
#include <QtWidgets>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    // Prepare layout
    QMainWindow *window = new QMainWindow;
    QWidget *centralWidget = new QWidget(window);
    QGridLayout *grid = new QGridLayout(centralWidget);

    QTextEdit *textEdit = new QTextEdit();

    window->setCentralWidget(centralWidget);

    QAction *toolAction = new QAction(window->style()->standardIcon(QStyle::SP_MediaPlay), "ToolButton", window);
    QObject::connect(toolAction, &QAction::triggered, [=]() {
       qDebug() << "action";
    });


    QPushButton *pushButton = new QPushButton(toolAction->icon(), "PushButton1", window);
    pushButton->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed);
    QPushButton *pushButton2 = new QPushButton(toolAction->icon(), "PushButton2", window);
    pushButton2->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed);
    QPushButton *pushButton3 = new QPushButton(toolAction->icon(), "PushButton2", window);
    pushButton3->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed);
    QObject::connect(pushButton3, &QPushButton::released, [window, pushButton3, toolAction](){
       QMenu menu;
       menu.addAction(toolAction);
       QPoint pos = window->mapToGlobal(pushButton3->pos());
       pos += QPoint(0, pushButton3->height());
       menu.exec(pos);
    });

    QObject::connect(pushButton, SIGNAL(pressed()), toolAction, SLOT(trigger()));
    QObject::connect(pushButton2, SIGNAL(pressed()), toolAction, SLOT(trigger()));

    QToolButton *toolButton = new QToolButton(window);
    toolButton->setToolButtonStyle(Qt::ToolButtonTextBesideIcon);
    toolButton->setText("Popup action");
    toolButton->addAction(toolAction);
    toolButton->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);

    QToolButton *toolButton2 = new QToolButton(window);
    toolButton2->setToolButtonStyle(Qt::ToolButtonTextBesideIcon);
    toolButton2->setDefaultAction(toolAction);
    toolButton2->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);

    toolButton->setMaximumHeight(pushButton->sizeHint().height());
    toolButton->setMinimumHeight(pushButton->sizeHint().height());
    toolButton2->setMaximumHeight(pushButton->sizeHint().height());
    toolButton2->setMinimumHeight(pushButton->sizeHint().height());

    grid->addWidget(textEdit    ,0,0,1,2);
    grid->addWidget(toolButton  ,1,0,1,1);
    grid->addWidget(pushButton  ,1,1,1,1);
    grid->addWidget(toolButton2 ,2,0,1,1);
    grid->addWidget(pushButton2 ,2,1,1,1);
    grid->addWidget(pushButton3 ,3,0,1,2);

    window->show();
    return a.exec();
}
person fbucek    schedule 20.02.2015
comment
Причина попытки использовать QToolButton, а не QPushButton, заключалась в том, что QToolButton автоматически принимает атрибуты действия (текст заголовка + значок) и обрабатывает связь сигнала/слота. Но, в конце концов, эти преимущества не стоят хлопот и недостатков, с которыми я столкнулся в плане высоты кнопок и выравнивания текста/значков. Поэтому я переключился на QPushButton и вручную установил атрибут text/icon и настроил привязку слота/сигнала. - person Philip Allgaier; 23.02.2015