3

我的 Qt Dialog 上有一些组合框和双旋转框。现在,当您右键单击小部件(旋转框或组合框)时,我需要一个菜单​​上的“ResetToDefault”项。

我怎么得到它。有什么方法可以让我在右键单击时出现自定义菜单,或者有没有一种方法可以将项目添加到右键单击时出现的菜单中。

4

2 回答 2

5

首先,对于 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方法)并将其显示在那里。但是你必须进行测试。

于 2008-10-10T11:27:05.707 回答
1

对于 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 上是公开的。

于 2008-10-10T13:20:03.207 回答