Program losujący - problem z dostępem globalnym

0

Witam serdecznie.
Problem dotyczy tego kodziku napisanego w QT Creator:
plik mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <QString>
#include <iostream>
#include <conio.h>
#include <stdlib.h>
#include <ctime>
using namespace std;

namespace Ui
{
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT
    
public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();

public slots:
    void on_pushButton_clicked();
    void on_pushButton_4_clicked();

private:
    Ui::MainWindow *ui;
}

;
#endif // MAINWINDOW_H

plik mainwindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"

QString nrindexu = ui->comboBox->currentIndex(),
        wprowadz = ui->lineEdit_3->text(),
        poczatek = ui->lineEdit->text(),
        koniec = ui->lineEdit_2->text();

int long a, b, c, d;
int e = nrindexu.toInt();

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::on_pushButton_clicked()
{
    srand(int(time(NULL)));
    a = poczatek.toLong();
    b = koniec.toLong();
    c = b - a;
    d = (rand()%c)+a;
}

void MainWindow::on_pushButton_4_clicked()
{
    if ((poczatek.toInt())<(wprowadz.toInt()) || (koniec.toInt())>(wprowadz.toInt()))
    {
        ui->label_3->setText("Nie cuduj, popraw!");
        ui->lineEdit_3->clear();
    }
    else
    {
        if (e>0)
        {
            if (d>(wprowadz.toInt()))
            {
                e-1=e;
                ui->label_3->setText("Pozostałe próby:",e,"/nWprowadziłeś większą liczbę od wylosowanej");
            }
            else
                if (d<(wprowadz.toInt()))
                {
                    e-1=e;
                    ui->label_3->setText("Pozostałe próby:",e,"/nWprowadziłeś mniejszą liczbę od wylosowanej");
                }
                else
                    if (d==(wprowadz.toInt()))
                    {
                        ui->label_3->setText("Trafiłeś brawo!");
                    }
        }
        else
        {
            ui->label_3->setText("No i ostatnie pudło.../nkoniec prób/n wylosowana liczba:",d);
            ui->lineEdit->clear();
            ui->lineEdit_2->clear();
        }

    }

}

W pliku .cpp u góry jest taka linijka, którą celowo tam dałem - QString. Chcę uzyskać dostęp globalny do QStringów bo są one używane we wszystkich funkcjach niezwracających (void). Mam dwa pytania. W jaki sposób można to zrobić? Czy koniecznie muszę bawić się w klasy pochodne, aby te QStringi były ogólnodostępne? Jeżeli coś jest źle i przypadkiem zobaczycie możecie dać znać, ale nie musicie. W końcu człowiek uczy się na własnych błędach :).
Pozdrawiam.

0
#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QGraphicsScene>
#include <QGraphicsView>
#include <ctime>
#include <cstdlib>

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT
    
public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();
    
private:
    Ui::MainWindow *ui;

private slots:
    void Losuj();
};

#endif // MAINWINDOW_H
#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    connect(ui->pushButton,SIGNAL(clicked()),this,SLOT(Losuj()));
    srand(time(0));
    ui->lineEdit_3->setEnabled(false);
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::Losuj()
{
    QString tmp="default";
    int poczatek=0;
    int koniec=0;
    bool fail=false;
    tmp=ui->lineEdit->text();
    poczatek=tmp.toInt(&fail,10);
    tmp=ui->lineEdit_2->text();
    koniec=tmp.toInt(&fail,10);
    if(fail==true)poczatek=rand()%(koniec-poczatek)+poczatek;
    tmp=tmp.number(poczatek,10);
    if(poczatek<koniec and fail==true)ui->lineEdit_3->setText(tmp);
    else ui->lineEdit_3->setText("Bledne dane.");
}

Wystarczy cos takiego bez zabawy w zmienne globalne. Ewentualnie jesli string ma byc "globalny" to sobie go zadeklaruj w klasie jako zmienna prywatna. Troche mylaco oznaczona zmienna fail ;) No ale qt zwracal to troche w inny sposob niz myslalem.

0

Trochę zamotałem, przepraszam. Już zmęczony wczorajszym dłubaniem zapomniałem dodać, że konkretnie chodzi o ui->... QString jest dostępny ok, ale nie mam dostępu do ui który występuje w klasie MainWindow o to konkretnie mi chodziło. Muszę mieć taką strukturę jaką napisałem ze względu na GUI jakie zrobiłem. Chcę po prostu obrać ten fragment kodu, który celowo dałem u góry tak aby mieć dostęp do niego we wszystkich funkcjach. Jak dam to w jakiejkolwiek funkcji to ma dostęp do ui tylko wewnątrz niej. Program z tym fragmentarycznie działa tak jak chcę, ale jak już mam to skleić w całość to niektóre rzeczy muszę ustawić tylko raz i to właśnie są te QStringi plus wartości typu int long oraz int, które są pod spodem.

0

obiekt *ui jest prywatny, nie możesz się do niego dostać inaczej jak przez funkcję.

0

Troche niejasno piszesz. W kazdym razie jesli chcesz miec dostep do tych zmiennych to tak czy tak wrzucasz jest do sekcji prywatnej klasy, a potem inicjalizujesz w konstruktorze. Bedziesz mial do nich dostep we wszystkich metodach tej klasy i nie musza byc globalne.

W ogole troche dziwnna skladnia e-1=e; nie spotkalem sie z czyms takim ;) Jesli chcesz licznikiem prob operowac to pisz jak czlowiek e--; ;) No i sprawdzaj tak jak ja u siebie czy na pewno wpisano liczbe, czyli czy konwersja przebiegla prawidlowo.

Sama przestrzen ui jest tylko po to zeby miec wlasnie dostep do obiektow ktore sa utworzone w wizualnym edytorze wygladu okna programu. Wszystko co tam sie utworzy jest wlasnie dostepne przez przestrzen nazw ui. Reszta rzeczy i to jak korzystasz robisz w klasie. Jak dla mnie tyle zmiennych jest zbednych, no ale jak wolisz.

0

To znaczy chodzi o sekcję prywatną klasy MainWindow w pliku nagłówkowym? Bo szczerze mówiąc próbowałem, ale nie potrafiłem tego zainicjalizować poprzez konstruktor. Kompilator wywalał mi błędy z pliku nagłówkowego. Robiłem to tak, że ten fragment z QStringiem wpisywałem do sekcji public lub private (tak metoda prób i błędów), no i potem próbowałem coś kombinować z inicjalizacją tych zmiennych, ale w końcu po wielu próbach zrezygnowałem. Funkcję inicjalizującą zostawiałem od tego momentu:

void MainWindow::initialize()
{
}

Jeżeli można podać jakiś przykład w jaki sposób to zrobić byłbym wdzięczny. Jakbym miał jakieś wartości typu int to bym wiedział jak je zainicjalizować, ale to są wartości typu QString więc nie wiem w jaki sposób na nich operować.

0

Operowales kiedykolwiek na klasach? Jesli nie wiesz jak dziala konstruktor to raczej nie.

Konstruktor domyslne wywolywany jest przy tworzeniu obiektu klasy, czy to domyslny czy definiowany przez uzytkownika.

Definiujesz zmienne w sekcji prywatnej

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QGraphicsScene>
#include <QGraphicsView>
#include <ctime>
#include <cstdlib>

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT
    
public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();
    
private:
    Ui::MainWindow *ui;
    QString tekst;
    int poczatek;
    int koniec;
    bool fail;

private slots:
    void Losuj();
};

#endif // MAINWINDOW_H

W konstruktorze je inicjalizujesz jakimis wartosciami. Sa one potem dostepne we wszystkich metodach tej klasy.

#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    connect(ui->pushButton,SIGNAL(clicked()),this,SLOT(Losuj()));
    srand(time(0));
    ui->lineEdit_3->setEnabled(false);
    tekst="xxx";
    poczatek=koniec=0;
    fail=false;
}

1 użytkowników online, w tym zalogowanych: 0, gości: 1