2013-03-13 2 views
0

Я хотел создать окно из главного окна и отправить его указатель на мое главное окно. Я сделал это один раз, и я хотел бы сделать это снова, но второй раз, я всегда эта ошибка при компиляции «нет необходимости конструктора по умолчанию доступной»нет соответствующего конструктора по умолчанию, но конструктор объявлен

Главное окно:

#include "costsimulator.h" 
#include "ui_costsimulator.h" 

#include "stonepricewindow.h" 

CostSimulator::CostSimulator(AionEnhancingSimulator *parent) : ui(new Ui::CostSimulator) 
{ 
ui->setupUi(this); 

parentPtr = parent; 
stonePrice = createStonePrice(); 
connect(ui->aionEnhancingSimulator, SIGNAL(clicked()), this, SLOT(showAionEnhancingSimulatorWindow())); 
connect(ui->stonePriceButton, SIGNAL(clicked()), this, SLOT(showStonePriceWindow())); 
} 

CostSimulator::~CostSimulator() 
{ 
delete ui; 
} 

void CostSimulator::showAionEnhancingSimulatorWindow() 
{ 
this->hide(); 
parentPtr->show(); 
} 

QStringList *createStonePrice() 
{ 
QStringList *tmp = new QStringList(); 

tmp->push_back(QString("80-30000000")); 
return (tmp); 
} 

void CostSimulator::showStonePriceWindow() 
{ 
StonePriceWindow *stonepricewindow = new StonePriceWindow(this); 
stonepricewindow->show(); 
} 

QStringList *CostSimulator::getStonePrice() 
{ 
return (stonePrice); 
} 

и заголовок :

#ifndef COSTSIMULATOR_H 
#define COSTSIMULATOR_H 

#include <QDialog> 

#include "aionenhancingsimulator.h" 

namespace Ui { 
class CostSimulator; 
} 

class CostSimulator : public QDialog 
{ 
Q_OBJECT 

public: 
AionEnhancingSimulator *parentPtr; 
explicit CostSimulator(AionEnhancingSimulator *parent); 
~CostSimulator(); 

QStringList *stonePrice; 

QStringList *createStonePrice(); 
QStringList *getStonePrice(); 
void showStonePriceWindow(); 

public slots: 
void showAionEnhancingSimulatorWindow(); 

private: 
Ui::CostSimulator *ui; 
}; 

#endif // COSTSIMULATOR_H 

и окна, которые вызывают проблемы:

#include "stonepricewindow.h" 
#include "ui_stonepricewindow.h" 
#include <QStringListModel> 
#include <QStandardItemModel> 
#include <QtGui> 

StonePriceWindow::StonePriceWindow(CostSimulator *parent) : ui(new Ui::StonePriceWindow) 
{ 
ui->setupUi(this); 
displayStonePriceList(parent); 
} 

StonePriceWindow::~StonePriceWindow() 
{ 
delete ui; 
} 

void StonePriceWindow::displayStonePriceList(CostSimulator *parent) 
{ 
// To do 
} 

заголовке

#ifndef STONEPRICEWINDOW_H 
#define STONEPRICEWINDOW_H 

#include <QDialog> 

#include "costsimulator.h" 

namespace Ui { 
class StonePriceWindow; 
} 

class StonePriceWindow : public QDialog 
{ 
Q_OBJECT 

public: 
explicit StonePriceWindow(CostSimulator *parent = 0); 
~StonePriceWindow(); 

void displayStonePriceList(CostSimulator *parent); 

private: 
Ui::StonePriceWindow *ui; 
}; 

#endif // STONEPRICEWINDOW_H 

, если бы я это «StonePriceWindow() {}» в заголовке StonePriceWindow, я не следующая ошибка: «указано несколько конструкторов по умолчанию» и всегда «нет необходимости и т.д ..»

Спасибо за любую помощь, я не понимаю, почему.

+1

Вместо того, чтобы потопить людей с кодом, вы действительно можете предоставить ошибку компиляции _exact_ и строку, на которой она была включена. – cmannett85

+0

stonepricewind.cpp: 7: erreur: C2512: 'Ui :: StonePriceWindow': нет подходящего конструктора по умолчанию, и он находится на этой строке: StonePriceWindow :: StonePriceWindow (CostSimulator * parent): ui (новый Ui :: StonePriceWindow) { ui-> setupUi (это); displayStonePriceList (родительский); } – user2102526

+1

Правильно, поэтому существуют два класса StonePriceWindow, один в пространстве имен 'Ui', и это вызывает проблему. Я бы предложил посмотреть на ui_stonepricewindow.h –

ответ

0

Я нашел проблему. В StonePrinceWindow.ui было устаревшее имя пользовательского интерфейса, поэтому автоматически генерируемый ui_stonepricewindow сохраняет устаревшее имя (даже после чистого), а компилятор никогда не находит ctor.

+1

Вы объяснили проблему, но не решение. Как вы это исправили? У меня точно такая же проблема. – carmenism

0

Попробуйте добавить StonePriceWindow() {} и удалить параметр по умолчанию для другого конструктора.

+0

Спасибо за помощь. Но есть точно такая же проблема. Public: StonePriceWindow() {} StonePriceWindow (CostSimulator * parent); ~ StonePriceWindow(); 'и всегда stonepricewindow.cpp: 7: erreur: C2512: 'Ui :: StonePriceWindow': нет подходящего конструктора по умолчанию – user2102526

0

Когда вы пишете код, как

StonePriceWindow x; 

как же компилятор, знаете ли вы вызвать конструктор без параметров или другой со значением по умолчанию для parent?

Вам необходимо либо удалить другой, либо удалить из него значение по умолчанию.

+0

Где это написано в предоставленном коде? И класс «StonePriceWindow» не имеет конструктора без параметров. – cmannett85

+0

Это не написано в коде, но компилятору необходимо создать экземпляр объекта где-то с функциональным кодом. «StonePriceWindow» не имеет без параметров ctor, поэтому он добавил одно - см. Последнее предложение вопроса: «Если бы у меня было это« StonePriceWindow() {} »в заголовке ...» –

+0

'new Ui :: StonePriceWindow', называемый в реализации «StonePriceWindow» ctor является «функционально равным» для «StonePriceWindow x». –

1

Извините, но я не мог добавить комментарий лучший ответ ..

У меня была аналогичная проблема тоже, оказалось, что существует несоответствие между именем класса кода я создал и Objectname диалоговые окна значение свойства в файле Qt .ui.

Я открыл файл .ui в QtDesigner и изменил значение свойства objectName на имя класса, которое я использовал в моем коде. После этого компиляция прошла нормально.