qt를 사용 중이며 두 개의 대화 상자가 내 중앙 위젯 앞에 표시되도록했습니다. 내 두 번째 대화 (playerInfo) 안에 qcombobox와 qintring을 취하는 qlineedit을 만들었습니다. 그런 다음 그 값을 플레이어 클래스에 저장합니다. 그러나 내 중앙 위젯을 만들고 플레이어 오브젝트를 전달하려고 할 때, 그것은 세분합니다.세그먼트 화 qt 프로그램에서 참조로 객체를 전달하려고 할 때 오류가 발생했습니다.
내 MAIN.CPP
int main(int argv, char* argc[]) {
int numberPlayers = 0;
QApplication app(argv, argc);
MainWindow mw;
numPlayers pPlayers; //first dialog that prompts the user to enter in how many players
numberPlayers = pPlayers.returnInput();
playerInfo *pInfo = new playerInfo(numberPlayers, &mw); //user enters in each players info based off number of players
pInfo->show();
return app.exec();
}
playerInfo 대화 :
이#include "playerinfo.h"
using namespace std;
playerInfo::playerInfo(int players, MainWindow *mw, QWidget *parent) :
QWidget(parent)
{
max_players = players;
wm = mw; //set wm to point to the address of the mainwindow object
setFixedSize(400, 400);
layout= new QVBoxLayout;
this->setLayout(layout);
title = new QLabel(tr("Please enter the following information:"));
layout->addWidget(title);
lineEdit = new QLineEdit; // create line edit
layout->addWidget(lineEdit);
comboBox = new QComboBox; // create combo box and add items to it
QStringList items = QStringList() << "Hat" << "Car" << "Shoe" << "SpaceShip" << "Basketball" << "Ring";
comboBox->addItems(items);
layout->addWidget(comboBox);
okay = new QPushButton(tr("Accept"));
layout -> addWidget(okay);
connect(okay, SIGNAL(clicked()), this, SLOT(storeInfo()));
}
QString playerInfo::getName() const
{
return lineEdit->text();
}
int playerInfo::getIndex() const
{
return comboBox->currentIndex();
}
void playerInfo::storeInfo()
{
hide();
index = getIndex();
name = getName();
wm->setPlayerData(index, name, pCounter);
pCounter++;
if (pCounter != max_players)
{
show();
}
else if (pCounter == max_players)
{
wm->setGUIWidgets(max_players);
wm->createCentralWidget();
wm->show();
}
}
내 centralwidget.cpp : 내 프로그램이 세그 폴트의 원인이되는 영역을 파악
#include "centralwidget.h"
#include <iostream>
#include <ctime>
#include <cstdlib>
using namespace std;
CentralWidget::CentralWidget(Player *players[0], int input): QWidget() {
for (int i = 0; i < input; i ++)
{
p.append(players[i]); << still segfaulting
// p[i] = players[i]; // segfaulting here <<<
}
}
입니다 내가 시도하고 playerInfo 대화 상자에서 전달 된 플레이어의 주소를 private 변수로 전달할 때 CentralWidget 클래스. (p[i] = players[i];
). 참조로 잘못 전달합니까?
헤더 파일과 같이 필요한 정보가 더 있으면 알려 주시기 바랍니다. 어떤 도움을 주셔서 감사합니다.
편집 :
#ifndef CENTRALWIDGET_H
#define CENTRALWIDGET_H
#include <QWidget>
#include <QtGui>
#include "player.h"
class CentralWidget: public QWidget {
Q_OBJECT
private:
QVector<Player> *p;
private slots:
public:
CentralWidget(Player *players[0], int input);
};
#endif
mainwindow.h :
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QtGui>
#include <iostream>
#include "guiplayervertical.h"
#include "centralwidget.h"
class MainWindow : public QMainWindow {
Q_OBJECT
private:
Player *players[4];
GUIPlayer* guiPlayers[4];
QWidget *centralWidget;
int input;
QList<int> index;
QList<QString> name;
public:
MainWindow();
void setPlayerData(int _index, const QString &_name, int i);
void setGUIWidgets(int input);
void createCentralWidget();
};
#endif
mainwindow.cpp
#include "mainwindow.h"
using namespace std;
MainWindow::MainWindow() {
}
void MainWindow::setPlayerData(int _index, const QString &_name, int i)
{
index.append(_index); // index is a member variable declared somewhere in your mainwindow.h
name.append(_name); // name is a member variable declared somewhere in your mainwindow.h
players[i] = new Player(name[i], index[i]);
guiPlayers[i] = new GUIPlayerVertical(players[i]);
}
void MainWindow::setGUIWidgets(int input)
{
if (input == 2)
{
addDockWidget(Qt::LeftDockWidgetArea, guiPlayers[0]);
addDockWidget(Qt::RightDockWidgetArea, guiPlayers[1]);
}
else if (input == 3)
{
addDockWidget(Qt::LeftDockWidgetArea, guiPlayers[0]);
addDockWidget(Qt::LeftDockWidgetArea, guiPlayers[1]);
addDockWidget(Qt::RightDockWidgetArea, guiPlayers[2]);
}
else
{
addDockWidget(Qt::LeftDockWidgetArea, guiPlayers[0]);
addDockWidget(Qt::LeftDockWidgetArea, guiPlayers[1]);
addDockWidget(Qt::RightDockWidgetArea, guiPlayers[2]);
addDockWidget(Qt::RightDockWidgetArea, guiPlayers[3]);
}
}
void MainWindow::createCentralWidget()
{
centralWidget = new CentralWidget(&players[0], input);
setCentralWidget(centralWidget);
}
여기서 p는 선언 되었습니까? – Nik
@nik 중앙 위젯 생성자 – user3587954
안에 .h 파일을 게시하면 도움이됩니까? 내 코드가 코드로 가득 찼 으면 좋겠어. – user3587954