我的 Qt Dialog 上有一些组合框和双旋转框。现在,当您右键单击小部件(旋转框或组合框)时,我需要一个菜单上的“ResetToDefault”项。
我怎么得到它。有什么方法可以让我在右键单击时出现自定义菜单,或者有没有一种方法可以将项目添加到右键单击时出现的菜单中。
我的 Qt Dialog 上有一些组合框和双旋转框。现在,当您右键单击小部件(旋转框或组合框)时,我需要一个菜单上的“ResetToDefault”项。
我怎么得到它。有什么方法可以让我在右键单击时出现自定义菜单,或者有没有一种方法可以将项目添加到右键单击时出现的菜单中。
首先,对于 Qt4,最简单的方法是创建一个动作来重置数据,并使用addAction
方法(或使用设计器)将其添加到小部件中。然后,将contextMenuPolicy
属性设置为Qt::ActionsContextMenu
。将出现上下文菜单并触发操作。
代码示例:
QAction *reset_act = new QAction("Reset to default");
mywidget->addAction(reset_act);
mywidget->setContextMenuPolicy(Qt::ActionsContextMenu);
// here connect the 'triggered' signal to some slot
对于 Qt3,您可能必须拦截上下文菜单事件,从而继承 QSpinBox 和其他。或者,也许您可以从主窗口拦截上下文菜单事件,检测它是否发生在应该具有上下文菜单的小部件上方(使用该QWidget::childAt
方法)并将其显示在那里。但是你必须进行测试。
对于 Qt4,您可以使用自己的 QLineEdit 为可编辑的 QComboBox 执行此操作。创建实现 contextMenuEvent 的派生 QLineEdit 类
class MyLineEdit : public QLineEdit
{
Q_OBJECT
public:
MyLineEdit(QWidget* parent = 0) : QLineEdit(parent){}
void contextMenuEvent(QContextMenuEvent *event)
{
QPointer<QMenu> menu = createStandardContextMenu();
//add your actions here
menu->exec(event->globalPos());
delete menu;
}
};
然后,使用QComboBox的setLineEdit函数设置行编辑
MyLineEdit* edit = new MyLineEdit();
comboBox->setLineEdit(edit);
组合框现在将使用您的行编辑类。createStandardContextMenu 函数创建正常的上下文菜单,您可以在显示之前在 contextMenuEvent 处理程序中添加您喜欢的任何新操作。
如果 QComboBox 不可编辑,则它没有默认上下文菜单,因此使用 Qt::ActionsContextMenu 方法要简单得多。
QAbstractSpinBox 也有一个 setLineEdit 函数,所以你可以使用类似的技术。虽然由于某种原因 setLineEdit 函数在 QAbstractSpinBox 上受到保护,但在 QLineEdit 上是公开的。