Qt:下拉按钮?

non*_*ot1 12 qt qt-designer

如何在Qt中创建"下拉按钮"?

有关非Qt示例,请参阅: 办公室中的组合按钮/下拉列表

关键点在于小部件需要主要动作的图标,以及视觉上分开的"下拉箭头"以显示次要图标/动作.

单击"下拉箭头"以查找辅助选项时,应向用户显示可供选择的其他图标的网格.(所有图标,没有文字.)

Qt有一个可以做到这一点的小部件吗?

如果没有,如何在Qt中创建?(我是新的Qt用户,因此基于Qt Designer的解决方案将是理想的.)

谢谢

chr*_*000 16

实际上,QToolButton做得很好.

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

OP似乎在Qt论坛上问了这个并得到了更好的答案.在此处添加它以获得完整性.


Alb*_*rto 7

你必须使用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>
Run Code Online (Sandbox Code Playgroud)


lep*_*rem 7

您可以只setMenu()在常规按钮上使用。

QMenu* menu = new QMenu(this);
menu->addAction(tr("Sub-action"));
ui->button->setMenu(menu);
Run Code Online (Sandbox Code Playgroud)

我不认为菜单扩展是有益的...


Cal*_*itt -1

您最好的选择是创建您自己的 QAbstractButton 子类来使用。您可能希望在指定部分绘制常规图标,并在其他区域绘制您自己的图标。您还需要捕获鼠标按下事件以显示弹出菜单(如果它位于指定区域)(而不是让常规按钮处理代码接受它,这会在释放鼠标时导致按钮单击信号) 。