2016-09-11 72 views
0

我做了一個名爲類mywindow的,從QWidget的繼承創建一個窗口。下面是mywindow.h的內容:認沽論點的Qt

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

由於您使用的是New Signal Slot Syntax,我會建議使用C++ 11的λ,而不是一個插槽,並調用所需的功能你的槽內,這裏是你的connect通話會是什麼樣子:

QObject::connect(fileMenu_open, &QAction::triggered, &myWindow, [&myWindow](){ 
    myWindow.openDialogBox("Title","Hello, this is a message"); 
}); 

注意openDialogBox是不是一個插槽這樣要求,它可以是任何正常功能。

如果你的編譯器不支持C++ 11 lambda表達式,你可能必須聲明,不帶任何參數插槽,並連接到該插槽。並且在該槽內用所需的參數調用你的函數。 。 。

0

使用lambda表達式

QObject::connect(fileMenu_open, &QAction::triggered, &myWindow, [QWeakPointer<MyWindow> weakWindow = myWindow]() 
{ 
    weakWindow->openDialogBox("Title","Hello, this is a message"); 
}); 

QWeakPointer使用的情況下,你的類被移動,所以「老」 mywindow的是一個懸擺指針
如果你的類將不會被移動,只是捕捉mywindow的。
請注意,我的代碼需要C++ 14的拉姆達捕獲來聲明一個變量

+0

* QWeakPointer對象只能通過從QSharedPointer分配來創建。*,見[這裏](https://doc.qt.io/qt-5/qweakpointer.html#details)。 'myWindow'不是'QSharedPointer'。 – Mike

+0

如果你擔心'myWindow'被複制或移動,然後'QObject's [不能](https://doc.qt.io/qt-5/qobject.html#no-copy-constructor-or-賦值運算符)複製。如果擔心'myWindow'是一個懸掛指針(如果被破壞),那麼當'context'對象被銷燬時連接會自動斷開連接,請參閱[here](https://doc.qt.io/qt -5/qobject.html#connect-5),並且回答中的上下文對象是'&myWindow'。我看不出在這裏嘗試使用'QWeakPointer'的任何一點。 – Mike

+0

是的,我的意思是QPointer。而你的鏈接只是說QObject不能被複制,不能移動。 –