我创建了一个名为MyWindow的类,它继承自QWidget以创建一个窗口。以下是mywindow.h的内容:
class MyWindow: public QWidget{
public:
MyWindow(QString title,QString icon,int w = 600,int h = 400);
int getWidth() const;
int getHeight() const;
public slots:
void openDialogBox(QString title,QString message);
private:
int m_width;
int m_height;
};
有一个openDialogBox插槽,它将标题和对话框的消息作为参数。
我做了一个菜单栏,基本上是这样的:
MyWindow myWindow("Example window",QCoreApplication::applicationDirPath() + "/icon.png");
QMenuBar menuBar(&myWindow);
menuBar.setGeometry(0,0,myWindow.getWidth(),menuBar.geometry().height());
QMenu *fileMenu = new QMenu("&File");
QAction *fileMenu_open = fileMenu->addAction("&Open");
MyWindow::connect(fileMenu_open,&QAction::triggered,&myWindow,&MyWindow::openDialogBox);
在最后一行中,我想向插槽&MyWindow::openDialogBox
发送参数。我试着这样做:
MyWindow::connect(fileMenu_open,&QAction::triggered,&myWindow,&MyWindow::openDialogBox("Title","Hello, this is a message"));
但它不起作用(我不需要你解释为什么它不起作用,我已经知道为什么)。如何正确地做到这一点才能起作用?
答案 0 :(得分:2)
由于您使用的是New Signal Slot Syntax,我建议您使用c ++ 11 lambda而不是插槽,并在插槽中调用所需的功能,以下是connect调用的外观像:
QObject::connect(fileMenu_open, &QAction::triggered, &myWindow, [&myWindow](){
myWindow.openDialogBox("Title","Hello, this is a message");
});
请注意,openDialogBox
不需要以这种方式作为插槽,它可以是任何正常的功能。
如果您的编译器不支持C ++ 11 lambda表达式,则可能必须声明一个不带任何参数的插槽,并连接到该插槽。在那个插槽里面用你想要的参数调用你的函数。 。
答案 1 :(得分:0)
使用lambdas
QObject::connect(fileMenu_open, &QAction::triggered, &myWindow, [QWeakPointer<MyWindow> weakWindow = myWindow]()
{
weakWindow->openDialogBox("Title","Hello, this is a message");
});
QWeakPointer用于移动你的课程,所以&#34; old&#34; myWindow是一个悬垂的指针
如果您的班级不被移动,只需捕获myWindow
请注意,我的代码需要C ++ 14来声明lambda capture