我有一个打开 QDialog 的主窗口。 我需要为 QDialog 创建刷新、保存、关闭(不保存)等菜单项
我向 QDialog 添加了自己的菜单,但它不起作用。
在 QDialog H 文件中我有
privete:
QMenuBar *menuBar = new QMenuBar();
QMenu *menuItem = new QMenu();
private slots:
void actionSaveTriggered();
在 QDialog CPP 文件中我有
TaskDetail::TaskDetail(QWidget *parent, int rowId) :
QDialog(parent),
ui(new Ui::TaskDetail)
{
menuBar = new QMenuBar(this);
menuItem = menuBar->addMenu("Actions");
menuItem->addAction("&Save", QKeySequence::Save, this, SLOT(actionSaveTriggered()));
menuItem->addAction("&Refresh");
menuItem->addAction("&Close");
ui->setupUi(this);
ui->formLayout->setMenuBar(menuBar);
}
void TaskDetail::actionSaveTriggered()
{
insertIntoTasks();
}
...
但是当我单击 QDialog 中的“&Save”菜单时,系统什么也没做...... 你能帮助我吗?我不知道出了什么问题。
我检查了代码修改,例如 触发()信号
menuItem->addAction("&Save", triggered(), this, SLOT(actionSaveTriggered()));
或者将 QAction 作为单独的对象:
QAction *saveAction = new QAction("Save", this);
menuItem->addAction(saveAction);
connect(saveAction, SIGNAL(triggered()), this, SLOT(actionSaveTriggered()));
但没有成功。
您输入的代码首先(遗憾的是)根本不正确。
menuItem->addAction("&Save", triggered(), this, SLOT(actionSaveTriggered()));
Qt 不会将上述代码视为错误,但通常您无法将
signal
对象(在本例中为 triggered()
)连接到 slot
macro 对象。
例如,对于您的代码,您至少应该在
SIGNAL(triggered())
信号定义之后的triggered
宏处,而且Qt不提供一些SIGNAL
相关的初始化程序和构造函数(这意味着您不能只将 triggered()
或 SIGNAL(triggered()
放入您第一个提供的代码中)。阅读文档可能会有所帮助。
更重要的是,如果您第二次提供代码,
connect(saveAction, SIGNAL(triggered()), this, SLOT(actionSaveTriggered()));
如果没有帮助,请尝试将其更改为
connect(saveAction, &QAction::triggered,
this, &TaskDetail::actionSaveTriggered);
如果这仍然没有帮助,请评论我。