Как использовать эти переменные в другой функции?

Я схожу с ума, пытаясь использовать переменные в другой функции в том же файле:

MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)

{

QLineEdit * street1BetSize = new QLineEdit("0"); // want to use these QLineEdit's
QLineEdit * street2BetSize = new QLineEdit("0");
QLineEdit * street3BetSize = new QLineEdit("0");
QLineEdit * street4BetSize = new QLineEdit("0");
QLineEdit * street5BetSize = new QLineEdit("0");

}

хочу использовать эти переменные здесь:

void MainWindow::runButtonClicked()
{
QVector<card> vDealt = cardDeck.deal_rand_cards(vDeck,3);
//qDebug()<<vStreetBets[0];

streetBetsList << street1BetSize << street2BetSize << street3BetSize << street4BetSize << street5BetSize;
QVector<int> vStreetBets;
for(int i=0;i<5;i++)
{
vStreetBets.append(streetBetsList[i]->text().toInt());
qDebug()<<"street bet: "<<vStreetBets[i];
}
}

Как здесь, я получаю

предупреждение: C4189:
‘street5BetSize’: локальная переменная инициализирована, но на нее нет ссылок

а также

error: C2065: 'street5BetSize' : undeclared identifier

для каждого.

Я пытался добавить extern QLineEdit * street1BetSize; к mainwindow.h, но это дает мне «неразрешенную внешнюю» ошибку.

1

Решение

Если у вас будет пять QLineEditдля каждого MainWindowзатем вы хотите, чтобы они были членами вашего класса. Просто добавьте их в определение вашего класса:

class MainWindow
{
// ...
private:
// ...
QLineEdit* street1BetSize;
QLineEdit* street2BetSize;
QLineEdit* street3BetSize;
QLineEdit* street4BetSize;
QLineEdit* street5BetSize;
}

Теперь каждый MainWindow объект будет иметь 5 указателей на QLineEdit, Они составляют часть государство этого объекта и могут быть доступны любой из его функций-членов. Теперь измените ваш конструктор на следующий, чтобы вы не переопределяли имена:

MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
street1BetSize = new QLineEdit("0");
street2BetSize = new QLineEdit("0");
street3BetSize = new QLineEdit("0");
street4BetSize = new QLineEdit("0");
street5BetSize = new QLineEdit("0");
}

На самом деле, вам лучше использовать список инициализации членов, как вы это сделали для QMainWindow а также ui:

MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent), ui(new Ui::MainWindow),
street1BetSize(new QLineEdit("0")), street2BetSize(new QLineEdit("0")),
street3BetSize(new QLineEdit("0")), street4BetSize(new QLineEdit("0")),
street5BetSize(new QLineEdit("0"))
{ }

И теперь вашему конструктору не нужно делать никакой работы.

Теперь вы можете обратиться к street1BetSize и друзья в других функциях члена MainWindow, Тем не менее, это всегда очень подозрительно, когда у вас есть переменные, которые нумеруются, как streetXBetSize, Это похоже на отличное место для массива или контейнера. Почему бы не попробовать std::vector<QLineEdit>, а затем вы можете добавлять и удалять QLineEditS, как вы хотите. Ваше определение класса теперь будет иметь:

class MainWindow
{
// ...
private:
// ...
std::vector<QLineEdit> streetBetSizes;
}

И ваш конструктор теперь может просто сделать:

MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent), ui(new Ui::MainWindow)
{
for (int i = 0; i < 5; i++) {
streetBetSizes.push_back(new QLineEdit("0"));
}
}
0

Другие решения

Переменные от street1BetSize to street5BetSize являются локальными переменными внутри конструктора MainWindow, они не видны другим функциям. Чтобы позволить другим функциям-членам класса получить к ним доступ, вы можете рекламировать их как члены класса MainWindow, чтобы состояние переменной было общим для класса. Вместо многих указателей переменных используйте std::vector объектов QLineEdit должно быть лучшим решением?

class MainWindow
{
public:
MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow),
streetBetSizes(5,QLineEdit("0"))
private:
// other member
std::vector<QLineEdit> streetBetSizes;
};
1

Объявите переменные как члены MainWindow, а затем просто инициализируйте их в конструкторе:

class MainWindow : public QMainWindow
{
...

private:
QLineEdit* m_street1BetSize;
QLineEdit* m_street2BetSize;
QLineEdit* m_street3BetSize;
QLineEdit* m_street4BetSize;
QLineEdit* m_street5BetSize;
};

MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
m_street1BetSize = new QLineEdit("0"); // want to use these QLineEdit's
m_street2BetSize = new QLineEdit("0");
m_street3BetSize = new QLineEdit("0");
m_street4BetSize = new QLineEdit("0");
m_street5BetSize = new QLineEdit("0");
}

Тогда вы можете использовать их в любом методе MainWindow.

0
По вопросам рекламы [email protected]