1

ツールバーの外側にアイコンとテキスト ( Qt::ToolButtonTextBesideIcon ) を含む QToolButtonを表示しています。各ボタンには、使用されるアイコンと表示されるテキストを決定する QAction が関連付けられています。これらのボタンはすべてQGridLayout内に配置されます。ここまでは順調ですね。

残念ながら、QToolButton に QAction を追加するとすぐに、Qt は最小サイズに縮小することを自動的に決定するように見えます。次の行を使用して、水平方向の動作を修正しました。

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

ただし、それでもボタンの高さは通常の (プッシュ) ボタンよりも小さくなります。他のさまざまなサイズ ポリシーを既に試しましたが、成功しませんでした。

この問題を解決するにはどうすればよいですか? 「通常の」ボタンの高さを決定する信頼できる方法はありますか?

私が思いついたアイデアの 1 つは、通常のダミー ボタンを作成し、同じレイアウトに配置して、そのサイズを読み取ることでした。このサイズを QToolButton に適用すると、ダミー ボタンが再び破棄されます。よりエレガントで信頼性の高い方法はありますか?

4

1 に答える 1

1

何を達成したいのか理解できません。

との違いは、QPushButtonPopupMenuが実装されていることです (QPushButton でも簡単に実行できます) 視覚的な違いは QToolButton の右下隅にある小さな矢印のみであることがわかります。QToolButtonQToolButtonQActionsQToolButton

QToolButtonこの矢印は、私にとってとの唯一の違いQPushButtonです。しかし、多分私は何かが欠けています。

あなたの例 ( QToolButton with icon + text: How to center both? ) から、そのポップアップ機能を使用したいようには見えません。QPushButtons の代わりに QToolButton を使用する理由がわかりません。

この例では、1)QToolButtonQPushButton 2) の同じ高さの PopuMenu を示しています。QPushButton

私としては、なぜ使用するのか理解できず、使いやすいときに次QToolButtonのように見せようとしますQPushButtonQPushButtonQToolButton

#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();
}
于 2015-02-20T13:38:21.313 に答える