Qt:下拉按钮?

时间:2011-04-17 17:58:28

标签: qt qt-designer

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

对于非Qt示例,请参阅: Combination button/dropdown in office

关键点是小部件需要一个主要动作的图标,以及一个视觉上独立的“下拉箭头”来显示辅助图标/动作。

点击次要选项的“下拉箭头”后,应向用户显示可供选择的其他图标网格。 (所有图标,无文字。)

Qt是否有可以执行此操作的小部件?

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

谢谢

9 个答案:

答案 0 :(得分:13)

实际上,QToolButton做得非常好。

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

看来OP在Qt论坛上问了这个并得到了更好的答案。在此处添加它是为了完整。

答案 1 :(得分: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>

答案 2 :(得分:4)

我从上一个项目的按钮创建了一个A firefoxlooking下拉菜单。基本上我是QPushButton的子类并做了一些自定义绘画。然后我使用函数(QPushButton.setMenu(Qmenu))向该按钮添加一个菜单。附图显示它的样子。

Dropbutton

答案 3 :(得分:4)

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

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

我不认为菜单扩展是兼容性的......

答案 4 :(得分:1)

您最好的选择是使用自己的QAbstractButton子类。您可能希望在指定部分绘制常规图标,在另一个区域绘制自己的图标。您还需要抓住鼠标按下事件以显示弹出菜单(如果它在指定区域中)(而不是让常规按钮处理代码接受它,这将导致鼠标释放时按下按钮的信号)

答案 5 :(得分:1)

一个简单的基于python的解决方案是使用&#39;激活&#39;功能:

在qt designer中,选择一个Combo-Box。然后将其重命名为QComboBoxName或您可能要调用的任何内容。然后在 init 函数中粘贴此代码:

MediaTypeFormatter

答案 6 :(得分:0)

我实际上并不知道这是否符合您的要求......但是试一试? http://doc.qt.io/archives/4.6/qtoolbutton.html#arrowType-prop

答案 7 :(得分:0)

我遇到了同样的问题。我没有找到任何适合的小部件。我使用两个按钮解决了问题,而第二个按钮设置为0,并设置了一个小的自绘箭头图标。你可以在这里看到它:

enter image description here  在左侧,一次在垂直中心,一次在底部。

这种解决方案存在缺陷。在OS X中,第二个按钮不像常规按钮那样绘制(因为自定义边距)并且显示为丑陋的矩形灰色按钮......

答案 8 :(得分:0)

我认为你想要继承QComboBox并重新实现所需的功能/外观(使用paintEvent或其他东西)作为它看起来最接近你所看到的小部件(我猜)。

祝你好运!