[QT] Manipulowanie zmienną globalną

Teraz ta metoda powinna usuwać tylko jeden plus

#include 

#include 

#include 

#include 

#include 

#include 

#include 

MyWindow::MyWindow (): QWidget()

{

    setGeometry (300,600,300,200);

    setWindowTitle ("Algorytm SJF");

    pushButton_1 = new QPushButton(this);

    pushButton_1->setObjectName(QString::fromUtf8("pushButton_1"));

    pushButton_1->setGeometry(QRect(10, 200, 100, 27));

    pushButton_1->setText("Zamknięta pula zadań");

    for(int i=0;i<10;i++)

    {

        label1[i] = new QLabel(this);

        label1[i]->setGeometry(40, (i+1)*10,175,20);


    }

   //label1->setGeometry(40, 40, 175, 20);


    label2 = new QLabel(this);

    label2->setGeometry(70,90,175,20);

    connect(pushButton_1,SIGNAL (clicked()),this, SLOT(Nowe_Okno()));

}

void MyWindow::Nowe_Okno()

{

    bool ok;

    x = QInputDialog::getInteger(this,"Pobieranie liczby","Podaj ilość procesów (od 1-10)", 0,-100,100,1,&ok);

    tab = new int[x];


    for(int i=0;i
    {

        tab[i] = Pierwszy(i);

    }

    if(x!=10)

    {

        for(int i=x;i<10;i++)

        {


           label1[i]->setText("");

        }

    }

    for(int i=0;i
    {

        a = i;

        m_timerid = startTimer(500);

    }


  // delete tab;

}


int MyWindow::Pierwszy(int g)

{


    bool ok;

    z = QInputDialog::getInteger(this,"Pobieranie liczby","Podaj wartośc", 0,-100,100,1,&ok);

    label1[g]->setText(QString(z, '+'));

    return z;



}

void MyWindow::timerEvent(QTimerEvent *event)

{


     QString tmp;

     tmp = label1[a]->text();

     tmp.chop(1);

     label1[a]->setText(tmp);

     if (tmp.isEmpty())

         killTimer(m_timerid);


}

Tylko, że robi to znowu tylko dla ostatniego labela, a ja chciałem zrobić tak, że np. wpiszemy że będą 3 procesy, i potem wpiszę długość dla każdego procesu, to będzie usuwało plus najpierw dla pierwszego procesu, jeżeli skończy przechodzi do usuwania plusów dla drugiego i to samo dla trzeciego.

Kod robi dokładnie to, co w nim napisałeś. Jeśli chcesz aby “usuwało plus najpierw dla pierwszego procesu, jeżeli skończy przechodzi do usuwania plusów dla drugiego” to trzeba napisać kod, który właśnie to robi.

W timerEvent usuwasz spod label1[a], podejrzewam, że ‘a’ to pole wskazujące na bieżący label. Wystarczy więc zmieniać ‘a’ wtedy, kiedy usunie się już wszystkie plusy z danej etykiety. Oczywiście trzeba też sprawdzać, czy nie usunięto ostatniego plusa z ostatniej etykiety itp., ogólnie trzeba to przemyśleć. Ale to jest kwestia 2 czy 3 if-ów i modyfikacji wskaźnika bieżącej etykiety.

To teraz tak:

#include 

#include 

#include 

#include 

#include 

#include 

#include 

MyWindow::MyWindow (): QWidget()

{

    setGeometry (300,600,300,200);

    setWindowTitle ("Algorytm SJF");

    pushButton_1 = new QPushButton(this);

    pushButton_1->setObjectName(QString::fromUtf8("pushButton_1"));

    pushButton_1->setGeometry(QRect(10, 200, 100, 27));

    pushButton_1->setText("Zamknięta pula zadań");

    for(int i=0;i<10;i++)

    {

        label1[i] = new QLabel(this);

        label1[i]->setGeometry(40, (i+1)*10,175,20);


    }

   //label1->setGeometry(40, 40, 175, 20);


    label2 = new QLabel(this);

    label2->setGeometry(70,90,175,20);

    connect(pushButton_1,SIGNAL (clicked()),this, SLOT(Nowe_Okno()));

}

void MyWindow::Nowe_Okno()

{

    bool ok;

    x = QInputDialog::getInteger(this,"Pobieranie liczby","Podaj ilość procesów (od 1-10)", 0,-100,100,1,&ok);

    tab = new int[x];


    for(int i=0;i
    {

        tab[i] = Pierwszy(i);

    }

    if(x!=10)

    {

        for(int i=x;i<10;i++)

        {


           label1[i]->setText("");

        }

    }


     m_timerid = startTimer(500);



  // delete tab;

}


int MyWindow::Pierwszy(int g)

{


    bool ok;

    z = QInputDialog::getInteger(this,"Pobieranie liczby","Podaj wartośc", 0,-100,100,1,&ok);

    label1[g]->setText(QString(z, '+'));

    return z;



}

void MyWindow::timerEvent(QTimerEvent *event)

{

    QString tmp;

    for(int i=0;i
    {

        while(!tmp.isEmpty())

        {

            QString tmp;

            tmp = label1[i]->text();

            tmp.chop(1);

            label1[i]->setText(tmp);

            if (tmp.isEmpty())

                killTimer(m_timerid);

        }

    }

}

W metodzie timerEvent jest pętla while , która stopniowo usuwa co jeden minus i teoretycznie ma działać, dopóki tmp nie będzie puste, jeżeli będzie puste to kończy działanie, pętla for zwiększa wartość i o 1 i znowu ma działać pętla while, która będzie usuwać plusy dla kolejnego labelu. Tylko że efekt jest zupełnie inny i plusy są i się nie usuwają w ogóle. Dlaczego nie działa to tak jak napisałem?

Wprowadzasz sobie pole m_curlabel – indeks bieżącej labelki, inicjujesz zerem i timerEvent może wyglądać mniej więcej tak:

QString tmp = label1[m_curlabel]->text();

   tmp.chop(1);

   label1[m_curlabel]->setText(tmp);


   if (tmp.isEmpty())

   {

      if(m_curlabel == 9) // ostatnia etykieta o indeksie 9 (z tego co zauważyłem na sztywno masz 10 etykiet w tablicy)

      {

      	killTimer(event->timerId());

      }

      else

      {

      	++m_curlabel;

      }

   }
MyWindow::MyWindow (): QWidget()

{

    setGeometry (300,200,600,600);

    setWindowTitle ("Algorytm SJF");

    pushButton_1 = new QPushButton(this);

    pushButton_1->setObjectName(QString::fromUtf8("pushButton_1"));

    pushButton_1->setGeometry(QRect(150, 10, 200, 50));

    pushButton_1->setText("Zamknięta pula zadań");

    pushButton_2 = new QPushButton(this);

    pushButton_2->setObjectName(QString::fromUtf8("pushButton_1"));

    pushButton_2->setGeometry(QRect(150, 70, 200, 50));

    pushButton_2->setText("Otwarta pula zadań");

    for(int i=0;i<10;i++)

    {

        label1[i] = new QLabel(this);

        label1[i]->setGeometry(150, ((i+1)*20)+200,175,20);

        label2[i] = new QLabel(this);

        label2[i]->setGeometry(70, ((i+1)*20)+200,175,20);

        label3[i] = new QLabel(this);

        label3[i]->setGeometry(120, ((i+1)*20)+200,175,20);

        wsk[i] = label1[i];


    }

    m_curlabel = 0;

    connect(pushButton_1,SIGNAL (clicked()),this, SLOT(Nowe_Okno()));

    connect(pushButton_2,SIGNAL (clicked()),this, SLOT(Nowe_Okno_2()));

}

void MyWindow::Nowe_Okno()

{

    f = 1;

    pushButton_1->setDisabled(true);

    pushButton_2->setDisabled(true);

    m_curlabel = 0;

    bool ok;

    x = QInputDialog::getInteger(this,"Pobieranie liczby","Podaj ilość procesów (od 1-10)", 0,-100,100,1,&ok);


    if(x!=0)

    {

        tab = new int[x];

        for(int i=0;i
        {

            tab[i] = Pierwszy(i);

        }

        if(x!=10)

        {

            for(int i=x;i<10;i++)

            {


               label1[i]->setText("");

            }

        }

        for(int i=0;i<10;i++)

        {

            label2[i]->setText("Proces nr ");

            label3[i]->setNum(i+1);

        }

        sortowanie_babelkowe(tab,x);

        m_timerid = startTimer(100);

        delete [] tab;

        tab = 0;

    }

}


int MyWindow::Pierwszy(int g)

{


    bool ok;

    z = QInputDialog::getInteger(this,"Pobieranie liczby","Podaj wartośc", 0,-100,100,1,&ok);

    label1[g]->setText(QString(z, '+'));

    return z;



}

void MyWindow::timerEvent(QTimerEvent *event)

{

    if(f == 1)

    {

        QString tmp = label1[m_curlabel]->text();

        tmp.chop(1);

        label1[m_curlabel]->setText(tmp);

        if (tmp.isEmpty())

        {

           if(m_curlabel == 9)

           {

              killTimer(m_timerid);

              for(int i=0;i<10;i++)

              {

                  label1[i] = wsk[i];

                  label2[i]->setText("");

                  label3[i]->setText("");

              }


                pushButton_1->setDisabled(false);

                pushButton_2->setDisabled(false);


           }

           else

           {

              ++m_curlabel;

           }

        }

    }

    if(f == 0)

    {


        tmp = label1[m_curlabel]->text();

        tmp.chop(1);

        label1[m_curlabel]->setText(tmp);

        if(tmp.isEmpty())

        {

            m_curlabel++;

        }

    }

}

void MyWindow::zamien_tab(int &a, int &b)

{

  int temp = a;

  a = b;

  b = temp;

}

void MyWindow::zamien_lab(int g)

{

    QLabel *tmp = label1[g];

    label1[g] = label1[g+1];

    label1[g+1] = tmp;

}


void MyWindow::sortowanie_babelkowe(int *tab, int n)

{

  for (int j=n-1; j>0; j--)

  {

      for (int i=0; i
      {

          if (tab[i]>tab[i+1])

          {

             zamien_tab(tab[i],tab[i+1]);

             zamien_lab(i);


          }

      }

  }


}

void MyWindow::Nowe_Okno_2()

{

    f = 0;

    QString temp;

    bool ok;

    for(int i=0;i<10;i++)

    {

        label2[i]->setText("Proces nr ");

        label3[i]->setNum(i+1);

    }

    z = QInputDialog::getInteger(this,"Pobieranie liczby","Podaj dlugość procesu", 0,-100,100,1,&ok);

    l=0;

    temp = label1[l]->text();

    while(!temp.isEmpty())

    {

       l++;

       temp = label1[l]->text();

    }

    label1[l]->setText(QString(z, '+'));


    m_timerid = startTimer(500);


}

Pracuję teraz nad nową funkcją - otwartą pulą procesów, czyli, że procesy można wprowadzać w każdej chwili.

Jak na razie mam dziwną sytuację, po wpisaniu parę razy liczb, program nagle “zatrzymuje się” i zjada wszystkie napisy "proces nr " i się zawiesza, tylko, że ja dla otwartej puli nie ustalałem, by usuwał jakiekolwiek napisy. Kod w metodzie timerEvent który dotyczy otwartej puli zaczyna się od if(f==0)