2014-05-01 1 views
0

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); 
} 
+0

여기서 p는 선언 되었습니까? – Nik

+0

@nik 중앙 위젯 생성자 – user3587954

+0

안에 .h 파일을 게시하면 도움이됩니까? 내 코드가 코드로 가득 찼 으면 좋겠어. – user3587954

답변

0

코드이기 때문에 난 정말 당신이 발생하는 문제를 발굴하지 않은 너무 연결되어 있고 아직 일부 정보가 누락되어 있습니다. 예를 들어, 사용자 입력이 정의되지 않았으므로 플레이어 수가 4를 초과하면 이됩니다.

그러나 일부 코딩 방법은 일부 리팩토링에 가치가 있습니다. 매개 변수로 전달 된 배열에 대한 포인터에서 복사 된 p의 할당에 문제가 있으므로 더 유연하고 오류가 발생하지 않는 방법으로 전환하는 것이 좋습니다. std::vector 또는이 경우 QVector을 사용하면 다른 컨테이너를 다시 생성하거나 고정 크기 배열을 사용하는 대신 더 나은 메모리 관리를 통해 가변 크기 배열의 이점을 얻을 수 있습니다.

클래스의 멤버에서

시작하고, 다른 클래스의 생성자에 매개 변수로 벡터를 전달할 때

players.append(new Player(name[i], index[i])); 

사용하여 컨테이너를 작성 그런

private: 
    QVector<Player*> players; 

선언하는을 사용 동일한 유형의 const 참조는 전체 객체가 아닌 단일 포인터를 전달하는 것과 같습니다.

CentralWidget(const QVector<Player*>& players); 

컨테이너를 사용하면 배열 크기를 별도로 지정할 필요가 없습니다. 마지막으로, 이는 많은 변경 사항을 단순화합니다.이제 매개 변수

centralWidget = new CentralWidget(players); 

으로 전체 구성원을 통과하고 단순히 더 이상 for 루프

p = players; 

필요가 없습니다를 사용하여 복사 할 수 있습니다.

관련 문제