如何在 Qt 中创建“下拉按钮”?
对于非 Qt 示例,请参阅: Office 中的组合按钮/下拉菜单
关键是小部件需要一个用于主要操作的图标,以及一个视觉上独立的“下拉箭头”来显示辅助图标/操作。
单击辅助选项的“下拉箭头”后,应向用户显示其他图标网格以供选择。(所有图标,没有文字。)
Qt 有可以做到这一点的小部件吗?
如果没有,如何在 Qt 中创建它?(我是一个新的 Qt 用户,所以基于 Qt Designer 的解决方案将是理想的。)
谢谢
如何在 Qt 中创建“下拉按钮”?
对于非 Qt 示例,请参阅: Office 中的组合按钮/下拉菜单
关键是小部件需要一个用于主要操作的图标,以及一个视觉上独立的“下拉箭头”来显示辅助图标/操作。
单击辅助选项的“下拉箭头”后,应向用户显示其他图标网格以供选择。(所有图标,没有文字。)
Qt 有可以做到这一点的小部件吗?
如果没有,如何在 Qt 中创建它?(我是一个新的 Qt 用户,所以基于 Qt Designer 的解决方案将是理想的。)
谢谢
实际上,QToolButton 做得很好。
http://qt-project.org/forums/viewthread/5377
看来 OP 在 Qt 论坛中提出了这个问题并得到了更好的答案。为了完整起见,在此处添加它。
您可以setMenu()
在常规按钮上使用。
QMenu* menu = new QMenu(this);
menu->addAction(tr("Sub-action"));
ui->button->setMenu(menu);
我不认为菜单扩展是临时性的......
您必须使用 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>
我为我以前的项目从一个按钮创建了一个 A firefoxlooking 下拉菜单。基本上我继承了 QPushButton 并做了一些自定义绘画。然后我使用函数 (QPushButton.setMenu(Qmenu) 向该按钮添加一个菜单。所附图像显示了它的外观。
我认为你会想要子类QComboBox
化并重新实现所需的功能/外观(使用paintEvent或其他东西),因为它看起来最接近你正在寻找的小部件(我猜)。
祝你好运!
一个简单的基于 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
我实际上不知道这是否符合您的要求……但试试看?http://doc.qt.io/archives/4.6/qtoolbutton.html#arrowType-prop
你最好的选择是制作你自己的 QAbstractButton 子类来使用。您可能希望在指定部分绘制常规图标,并在其他区域绘制您自己的图标。如果弹出菜单位于指定区域,您还需要抓住鼠标按下事件以显示弹出菜单(而不是让常规的按钮处理代码获取它,这会在释放鼠标时导致按钮单击信号) .