16

Qtで「ドロップダウンボタン」を作成するにはどうすればよいですか?

Qt 以外の例については、次を参照してください: Office の組み合わせボタン/ドロップダウン

重要な点は、ウィジェットにはプライマリ アクション用のアイコンと、セカンダリ アイコン/アクションを表示する視覚的に分離された「プルダウン矢印」が必要だということです。

二次オプションの「プルダウン矢印」をクリックすると、選択できる他のアイコンのグリッドがユーザーに表示されます。(すべてアイコンで、テキストはありません。)

Qtにはこれを行うことができるウィジェットがありますか?

そうでない場合、これを Qt でどのように作成できますか? (私は新しい Qt ユーザーなので、Qt Designer ベースのソリューションが理想的です。)

ありがとうございました

4

8 に答える 8

20

実際、QToolButton はこれを非常にうまく行います。

http://qt-project.org/forums/viewthread/5377

OPがQtフォーラムでこれを尋ね、より良い答えを得たようです。完全を期すためにここに追加します。

于 2012-09-05T14:38:46.270 に答える
10

setMenu()通常のプッシュボタンでそのまま使用できます。

QMenu* menu = new QMenu(this);
menu->addAction(tr("Sub-action"));
ui->button->setMenu(menu);

メニュー展開は任意ではないと思いますが…

于 2015-09-14T21:44:41.053 に答える
9

QToolButton を使用する必要があります。次に、ボタンのテキストの代わりにアイコンを設定し、popupmenu プロパティを menubuttonpopup に設定します。これは私のコードです:

//widget.cpp:
#include "widget.h"
#include "ui_widget.h"

#include <QtGui>

Widget::~Widget()
{
    delete ui;
}

Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);
    menu   = new QMenu(this);
    act0 = new QAction("test",this);
    act1 = new QAction("test1",this);
    act0->setObjectName("act0");
    act1->setObjectName("act1");
    menu->addAction(act0);
    menu->addAction(act1);
    ui->toolButton->setMenu(menu);
    connect(ui->toolButton,SIGNAL(clicked()),this,SLOT(slotTest()));
    connect(act0,SIGNAL(triggered()),this,SLOT(slotTest()));
    connect(act1,SIGNAL(triggered()),this,SLOT(slotTest()));
    adjustSize();
}

void Widget::slotTest()
{
    QToolButton *tbtn = qobject_cast<QToolButton*>(sender());
    QAction *act = qobject_cast<QAction*>(sender());
    if(tbtn)
    {
        qDebug() << "event raised by QToolButton: " << tbtn->objectName();
    }
    if(act)
    {
        qDebug() << "event raised by QAction: " << act->objectName();
    }
}

//widget.h:
#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
class QMenu;
class QAction;
namespace Ui {
class Widget;
}

class Widget : public QWidget
{
    Q_OBJECT

public:
    explicit Widget(QWidget *parent = 0);
    ~Widget();
private slots:
    void slotTest();
private:
    QMenu *menu;
    QAction *act0;
    QAction *act1;
    Ui::Widget *ui;
};

#endif // WIDGET_H

//widget.ui:
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
 <class>Widget</class>
 <widget class="QWidget" name="Widget">
  <property name="geometry">
   <rect>
    <x>0</x>
    <y>0</y>
    <width>53</width>
    <height>40</height>
   </rect>
  </property>
  <property name="windowTitle">
   <string>Widget</string>
  </property>
  <layout class="QVBoxLayout" name="verticalLayout">
   <item>
    <widget class="QToolButton" name="toolButton">
     <property name="text">
      <string/>
     </property>
     <property name="icon">
      <iconset>
       <normaloff>cerca.png</normaloff>cerca.png</iconset>
     </property>
     <property name="popupMode">
      <enum>QToolButton::MenuButtonPopup</enum>
     </property>
    </widget>
   </item>
  </layout>
 </widget>
 <layoutdefault spacing="6" margin="11"/>
 <resources/>
 <connections/>
</ui>
于 2012-10-10T08:41:25.750 に答える
1

必要な機能をサブクラス化して再実装したいと思うと思いますQComboBox/探しているものに最も近いウィジェットとして(paintEventなどを使用して)見てください(私は推測します)。

幸運を!

于 2011-04-18T06:54:05.943 に答える
0

これがあなたの望みどおりになるかどうかはわかりませんが、試してみてください。http://doc.qt.io/archives/4.6/qtoolbutton.html#arrowType-prop

于 2011-04-17T18:00:26.410 に答える
-1

最善の策は、使用するQAbstractButtonの独自のサブクラスを作成することです。指定された部分に通常のアイコンを描画し、他の領域に独自のアイコンを描画することをお勧めします。また、ポップアップメニューが指定された領域にある場合は、マウスプレスイベントを取得してポップアップメニューを表示する必要があります(通常のボタン処理コードで取得するのではなく、マウスを離したときにボタンクリック信号が表示されます)。 。

于 2011-04-18T21:17:26.467 に答える