如何在Qt中创建“下拉按钮”?
对于非Qt示例,请参阅: Combination button/dropdown in office
关键点是小部件需要一个主要动作的图标,以及一个视觉上独立的“下拉箭头”来显示辅助图标/动作。
点击次要选项的“下拉箭头”后,应向用户显示可供选择的其他图标网格。 (所有图标,无文字。)
Qt是否有可以执行此操作的小部件?
如果没有,如何在Qt中创建? (我是一个新的Qt用户,因此基于Qt Designer的解决方案将是理想的。)
谢谢
答案 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))向该按钮添加一个菜单。附图显示它的样子。
答案 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,并设置了一个小的自绘箭头图标。你可以在这里看到它:
在左侧,一次在垂直中心,一次在底部。
这种解决方案存在缺陷。在OS X中,第二个按钮不像常规按钮那样绘制(因为自定义边距)并且显示为丑陋的矩形灰色按钮......
答案 8 :(得分:0)
我认为你想要继承QComboBox
并重新实现所需的功能/外观(使用paintEvent或其他东西)作为它看起来最接近你所看到的小部件(我猜)。
祝你好运!