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 回答
4

我为我以前的项目从一个按钮创建了一个 A firefoxlooking 下拉菜单。基本上我继承了 QPushButton 并做了一些自定义绘画。然后我使用函数 (QPushButton.setMenu(Qmenu) 向该按钮添加一个菜单。所附图像显示了它的外观。

下拉按钮

于 2012-09-08T15:42:21.560 回答
1

我认为你会想要子类QComboBox化并重新实现所需的功能/外观(使用paintEvent或其他东西),因为它看起来最接近你正在寻找的小部件(我猜)。

祝你好运!

于 2011-04-18T06:54:05.943 回答
1

一个简单的基于 python 的解决方案是使用“激活”功能:

在 qt 设计器中,选择一个组合框。然后将其重命名为 QComboBoxName 或您可能想调用的任何名称。然后在init函数中,粘贴以下代码:

self.QComboBoxName.activated.connect(self.someFunction)

def someFunction(self): #foo
    text=self.QComboBoxName.currentText()
    #do something with this text string
    if (text=='someString'): #do this 
    else : pass
于 2018-06-17T13:09:17.930 回答
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 回答