새 창을 열고 새 창에서 "닫기"기능으로 버튼을 연결하는 주 창이 있습니다. 문제는 새 창에 둘 이상의 단추가있을 때 발생합니다. 그것은 항상 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...
라인을 놓고, 창을 닫는 버튼은 마지막 "-"버튼이며 리턴 값은 아니다. 이자형.
'Screen_Char_Info' 클래스에 속한 버튼의 클릭 신호를이 클래스 외부의'Screen_Char_Info' 클래스에 속한 슬롯에 연결하는 이유는 무엇입니까? 클래스 내부에서이를 수행하는 것이 더 나은 설계가 아닐까요? 당신은 완전히 [encapsulation] (http://en.wikipedia.org/wiki/Encapsulation_ (object-oriented_programming))을 이와 같이 삭제합니다. – thuga