【发布时间】:2012-01-11 15:18:49
【问题描述】:
我正在创建一个文本编辑器,我想将QComboBox 放入QMenu。我在QMenu 中没有找到任何处理这种事情的方法。最接近的是QMenu::addAction()。我想知道如何绕过这个障碍。
谢谢!
【问题讨论】:
我正在创建一个文本编辑器,我想将QComboBox 放入QMenu。我在QMenu 中没有找到任何处理这种事情的方法。最接近的是QMenu::addAction()。我想知道如何绕过这个障碍。
谢谢!
【问题讨论】:
您必须继承QWidgetAction,然后只需将addAction 调用到您的菜单。
带有标签的 Spin Box Action 示例代码
class SpinBoxAction : public QWidgetAction {
public:
SpinBoxAction (const QString& title) :
QWidgetAction (NULL) {
QWidget* pWidget = new QWidget (NULL);
QHBoxLayout* pLayout = new QHBoxLayout();
QLabel* pLabel = new QLabel (title); //bug fixed here, pointer was missing
pLayout->addWidget (pLabel);
pSpinBox = new QSpinBox(NULL);
pLayout->addWidget (pSpinBox);
pWidget->setLayout (pLayout);
setDefaultWidget(pWidget);
}
QSpinBox * spinBox () {
return pSpinBox;
}
private:
QSpinBox * pSpinBox;
};
现在只需创建它并将其添加到您的菜单中
SpinBoxAction * spinBoxAction = new SpinBoxAction(tr("Action Title"));
// make a connection
connect(spinBoxAction ->spinBox(), SIGNAL(valueChanged(int)),
this, SLOT(spinboxValueChanged(int)));
// add it to your menu
menu->addAction(spinBoxAction);
【讨论】:
pWidget 分开并调用setDefaultWidget 吗?子类化的唯一原因难道不是实现createWidget吗?
QWidgetAction,我能够拥有一个可重用的元素,并且在每种情况下我只需要更改构造函数参数。此外,还可以直接创建一个带有操作小部件的小型库,并在需要时调用您需要的小部件。
SpinBoxAction (const QString& title) : QWidgetAction (NULL) {}
NULL 作为参数调用父级的构造函数。 stackoverflow.com/questions/120876/…
QWidgetAction 是一个包含QWidget 的QAction。您可以使用它来封装您的QComboBox,并通过QMenu::addAction 将其添加到您的菜单中。
【讨论】:
您始终可以使用QWidget 或QFrame 作为菜单小部件,然后在其上放置QHBoxLayout,并在其中插入您的QWidgets。
【讨论】: