Pregunta

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.

¿Fue útil?

Solución 2

If you are going to have five QLineEdits 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 QLineEdits 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"));
  }
}

Otros consejos

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;
};

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top