2015-07-04 73 views
1

我試圖實現退出按鈕,但我無法使用connect()方法來執行此操作。事實上,就我所知,我的按鈕沒有發出任何信號,但我找不到問題。 這裏是我的代碼部分使用connect()方法:在Qt中實現退出按鈕

#include "MyMainWindow.h" 

MyMainWindow::MyMainWindow(QWidget * parent, Qt::WindowFlags flag) : 
     QMainWindow(parent, flag) 
{ 
    this->setFixedSize(1120, 630); 
    menu = new MyMenu(this); 
    this->setCentralWidget(menu); 
    this->show(); 
    // the connect implementation 
    connect(menu->exit, SIGNAL(clicked()), this, SLOT(this->exit_button_clicked())); 
} 

MyMainWindow::~MyMainWindow() 
{ 
} 

void MyMainWindow::exit_button_clicked() 
{ 
    this->close(); 
} 

MyMainWindow是朋友類MyMenuexit是私人QPushButton。現在我想要解決這個問題的一些幫助。

回答

1

您可以按以下直接使用

connect(menu->exit, SIGNAL(clicked()), this, SLOT(close())); 

沒有必要創造新的方法exit_button_clicked()SLOT

+0

謝謝,它現在正常工作:-) – kahrabian

2

SLOT是實際接受字符串,而不是C++宏 - 有效的表達。

SLOT(this->exit_button_clicked())將不會鏈接到正確的插槽。您需要編寫SLOT(exit_button_clicked())。 Qt Creator的自動完成可以爲選定的對象提供有效的插槽。

一個推薦的選擇是使用new syntax。如果你的編譯器支持C++ 11,你可以在Qt 5中使用它。這個語法的優點是編譯時檢查信號,插槽及其參數。

如果menu->exit是私密的,除非聲明爲friend class,否則不能從另一個類訪問它。您可能需要在MyMenu課程中創建一個公共獲取者。

+0

謝謝你,但非這些方法正在工作。第一個解決方案編譯但不調用所需的方法,第二個解決方案給我編譯錯誤(Clion將它標記爲紅色)。這裏是我更改的'connect()'方法:'connect(menu-> exit,&QPushButton :: clicked,this,&MyMainWindow :: exit_button_clicked);'這是正確的實現嗎? – kahrabian

+0

'menu-> exit'是一個'QPushButton'嗎? –

+0

是的,它實際上是一個指向QPushButton的指針 – kahrabian

0

即使有不使用lambda表達式,用於簡單的動作lambda表達式偉大的工作的解決方案:

connect(menu->exit, &QPushButton::clicked(), [&this]{ exit_button_clicked(); }); 

這是相當不錯的,當實際語法做的事情是如此接近你對它的期望: )