2014-11-15 4 views
0

새 창을 열고 새 창에서 "닫기"기능으로 버튼을 연결하는 주 창이 있습니다. 문제는 새 창에 둘 이상의 단추가있을 때 발생합니다. 그것은 항상 explicited 대신 마지막으로 생성 된 버튼을 연결합니다. 다음은 샘플 작업 코드는 다음과 같습니다QT - 회원 QWidget에서 잘못된 버튼을 연결합니다.

"MAIN.CPP"

#include "mainwindow.h" 
#include <QApplication> 

int main(int argc, char *argv[]) 
{ 
    QApplication a(argc, argv); 
    MainWindow w; 
    w.show(); 

    return a.exec(); 
} 

"mainwindow.h"

#ifndef SCREEN_CHAR_INFO_H 
#define SCREEN_CHAR_INFO_H 

#include <QString> 
#include <QMenu> 
#include <QMenuBar> 
#include <QLabel> 
#include <QTextEdit> 
#include <QPushButton> 
#include <QWidget> 
#include <QLineEdit> 
#include <QGridLayout> 

class Screen_Char_Info : public QWidget { 
    Q_OBJECT 

public: 
    QPushButton *buttons_modify_attributes[15]; 
    QPushButton *button_return; 
    QGridLayout *layout; 

    Screen_Char_Info() { 
     this->setAttribute(Qt::WA_DeleteOnClose); 
     this->setWindowTitle("Character Info"); 
     layout = new QGridLayout(this); 

     for (int i = 0; i <= 15; i++) { 
      buttons_modify_attributes[i] = new QPushButton((i%2 ? "-" : "+"), this); 
      connect(buttons_modify_attributes[i], &QPushButton::clicked, [this] { 

      }); 
      layout->addWidget(buttons_modify_attributes[i], (i/2), (i % 2), 1, 1); 
     } 


     layout->addWidget(button_return = new QPushButton("Return", this), 8, 0, 1, 1); 


     this->setLayout(layout); 
    } 

}; 

#endif // SCREEN_CHAR_INFO_H 

그러나

#ifndef MAINWINDOW_H 
#define MAINWINDOW_H 

#include "screen_char_info.h" 
#include <QMainWindow> 

class MainWindow : public QMainWindow 
{ 
    Q_OBJECT 

public: 
    QPushButton *button_show_char_info; 
    Screen_Char_Info *screen_char_info; 

    QWidget *mainwidget; 
    QVBoxLayout *layout_main; 

    MainWindow(QWidget *parent = 0) : QMainWindow(parent) { 
     button_show_char_info = new QPushButton("Character info", this); 
     layout_main = new QVBoxLayout(); 
     mainwidget = new QWidget(this); 


     screen_char_info = NULL; 

     QObject::connect (button_show_char_info, &QPushButton::clicked, [this]{ 
      if (screen_char_info == NULL) { 
       screen_char_info = new Screen_Char_Info(); 
       screen_char_info->show(); 
       QObject::connect (screen_char_info->button_return, &QPushButton::clicked, [=] { 
        screen_char_info->close(); 
        screen_char_info = NULL; 
       }); 
      } 
     }); 



     layout_main->addWidget(button_show_char_info); 
     mainwidget->setLayout(layout_main); 
     setCentralWidget(mainwidget); 
    } 

    ~MainWindow() 
    { 

    } 

}; 

#endif // MAINWINDOW_H 

"screen_char_info.h", 경우 나는 for 루프 앞에 layout->addWidget(button_return... 라인을 놓고, 창을 닫는 버튼은 마지막 "-"버튼이며 리턴 값은 아니다. 이자형.

+0

'Screen_Char_Info' 클래스에 속한 버튼의 클릭 신호를이 클래스 외부의'Screen_Char_Info' 클래스에 속한 슬롯에 연결하는 이유는 무엇입니까? 클래스 내부에서이를 수행하는 것이 더 나은 설계가 아닐까요? 당신은 완전히 [encapsulation] (http://en.wikipedia.org/wiki/Encapsulation_ (object-oriented_programming))을 이와 같이 삭제합니다. – thuga

답변

0

버그를 발견했습니다. 버튼 매트릭스를 15 개 요소로 선언했지만, 16 개 요소 루프를 반복했습니다. 16 번째 요소는 돌아 가기 버튼이었고 루프에서 덮어 썼습니다.

0

연결 방법은 일반적인 것으로 보이지 않습니다. 기존의 Qt는 방법을 사용해보십시오 :

class ObjHandler 
{ 
    public slot: 
     void onClicked(); 
}; 

가 ... 만족해야

실제로 어떤 객체에 QPushButton을하고 pObjectToHandle를 가리키는 QPushButton을 * pButtonPress 제공
connect(pButtonToPress, SIGNAL(clicked()), pObjectToHandle, SLOT(onClicked)); 

('이'포인터가 될 수 있습니다.) SIGNAL과 SLOT은 Qt 메타 오브젝트 컴파일러의 도움을 받아 작동하는 매크로입니다. 그렇기 때문에 slot : 문을 사용하는 것이 매우 중요합니다.

관련 문제