在Qt中的插槽中放入参数

时间:2016-09-11 14:55:13

标签: c++ qt

我创建了一个名为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"));

但它不起作用(我不需要你解释为什么它不起作用,我已经知道为什么)。如何正确地做到这一点才能起作用?

2 个答案:

答案 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

中的变量