Reputation: 1835
I am driving myself crazy trying use variables in another function in the same file:
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");
}
want to use thos variables here:
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];
}
}
As it is here, I am getting
warning: C4189: 'street5BetSize' : local variable is initialized but not referenced
and
error: C2065: 'street5BetSize' : undeclared identifier
for each one.
I tried adding extern QLineEdit * street1BetSize;
to mainwindow.h, but this gives me an "unresolved external" error.
Upvotes: 1
Views: 346
Reputation: 110698
If you are going to have five QLineEdit
s for each MainWindow
, then you want them to be members of your class. Just add them to your class definition:
class MainWindow
{
// ...
private:
// ...
QLineEdit* street1BetSize;
QLineEdit* street2BetSize;
QLineEdit* street3BetSize;
QLineEdit* street4BetSize;
QLineEdit* street5BetSize;
}
Now, each MainWindow
object will have 5 pointers to QLineEdit
. These make up part of the state of that object and can be accessed by any of its member functions. Now change your constructor to the following, so that you don't redefine the names:
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");
}
In fact, you'd be better off using the member initialization list, as you have done for QMainWindow
and 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"))
{ }
And now your constructor doesn't need to do any work.
Now you can refer to street1BetSize
and friends in the other member functions of MainWindow
. However, it's always very suspect when you have variables that are numbered, like streetXBetSize
. This seems like a great place for an array or container. Why not try an std::vector<QLineEdit>
, and then you can add and remove QLineEdit
s as you wish. Your class definition would now have:
class MainWindow
{
// ...
private:
// ...
std::vector<QLineEdit> streetBetSizes;
}
And your constructor could now simply do:
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent), ui(new Ui::MainWindow)
{
for (int i = 0; i < 5; i++) {
streetBetSizes.push_back(new QLineEdit("0"));
}
}
Upvotes: 0
Reputation: 45420
Variables from street1BetSize to street5BetSize
are local variables inside MainWindow constructor, they are not visible to other functions. To enable other class member function to access them, you could promote them as MainWindow class members, so the variable state is shared among the class. Instead of many variable pointers, use std::vector
of QLineEdit objects should be a better solution?
class MainWindow
{
public:
MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow),
streetBetSizes(5,QLineEdit("0"))
private:
// other member
std::vector<QLineEdit> streetBetSizes;
};
Upvotes: 1
Reputation: 6678
Declare the variables as members of MainWindow, and then just initialize them in the constructor:
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");
}
Then you can use them in any method of MainWindow.
Upvotes: 0