Я схожу с ума, пытаясь использовать переменные в другой функции в том же файле:
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, но это дает мне «неразрешенную внешнюю» ошибку.
Если у вас будет пять 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>
, а затем вы можете добавлять и удалять QLineEdit
S, как вы хотите. Ваше определение класса теперь будет иметь:
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"));
}
}
Переменные от 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;
};
Объявите переменные как члены 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.