1

同じファイル内の別の関数で変数を使用しようと夢中になっています。

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");

}

ここでthos変数を使用したい:

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

それぞれについて。

mainwindow.hに追加しようとしextern QLineEdit * street1BetSize;ましたが、これにより「未解決の外部」エラーが発生します。

4

3 に答える 3

1

からの変数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;
};
于 2012-12-29T08:44:44.573 に答える
0

QLineEdit各に5 つの がある場合は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実際、 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"))
{ }

これで、コンストラクターは何もする必要がなくなりました。

street1BetSizeこれで、 の他のメンバー関数で および フレンドを参照できるようになりましたMainWindow。ただし、のように番号が付けられた変数がある場合は、常に非常に疑わしいですstreetXBetSize。これは、配列またはコンテナーに最適な場所のようです。を試してみませんか。そうすれば、必要に応じてstd::vector<QLineEdit>を追加および削除できQLineEditます。クラス定義は次のようになります。

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"));
  }
}
于 2012-12-29T08:45:36.083 に答える
0

変数を 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 の任意のメソッドでそれらを使用できます。

于 2012-12-29T08:43:10.703 に答える