QT - slot i nie działająca funkcja

0

Cześć.
Mam funkcję wczytującą dane z pliku i wyświetlającą je w formie widgetów na ekranie. Przy pierwszym uruchomieniu funkcja jest wywoływana automatycznie i wszystko działa, lecz gdy dorzuciłem sprawdzanie, czy zaszły zmiany w pliku, widgety już się nie pojawiają (ale sama funkcja się wywołuje).

watcher = new QFileSystemWatcher(this);
  watcher->addPath("/home/diego/wlasny");
  connect(watcher, SIGNAL(directoryChanged(const QString &)), this, SLOT(aktualizuj()));


void MainWindow::aktualizuj()
{
  wyczysc_kursy();
  sleep(1); //Czas z zapasem, aby plik zdążył się zapisać.
  wczytaj(tab_2, tab_3, 1920);
}
 

Funkcja wyczysc_kursy() działa, lecz wczytująca już nie przynosi efektu (ale na pewno działa, bo przy pierwszym uruchomieniu działa).
Jakiś pomysł, o co może chodzić?

1
  1. sleep w slocie to fatalny pomysł, blokujesz eventloopa.
  2. Bez definicji wczytaj ciężko cokolwiek powiedzieć.
  3. używaj nowego syntaxu connect, tego bez makr.
0

Sleep dałem tylko chwilowo, wiem, że to złe rozwiązanie, po prostu wcześniej program wczytywał plik, zanim ten się zapisał(a niektóre programy tak zapisują, że najpierw usuwają plik i tworzą nowy) i nie mógł go otworzyć. Jak zadziała, to zmienię to na jakieś sensowne rozwiązanie.

 
void wczytaj(QWidget *tab_2, QWidget *tab_3, float width)
{
  std::ifstream dane;
  dane.open("PLIK_ZAPISANE.txt");
  std::string godzina, dzien, typ, tresc, tresc1, tresc2, tresc3, cala, kosz;
  while(getline(dane, tresc))
    {
      getline(dane, kosz);
      getline(dane, tresc1);
      getline(dane, kosz);
      getline(dane, kosz);
      getline(dane, tresc2);
      getline(dane, typ);
      getline(dane, kosz);
      getline(dane, kosz);
      getline(dane, godzina);
      godzina.erase(6,4);
      std::string godz = godzina;
      godz = godz.erase(0,2);
      godz = godz.insert(2,":");
      godz = godz.insert(5, " - ");
      godz = godz.insert(10, ":");
      cala = godz + "\n" + tresc + "\n" + tresc1 + "\n" + tresc2;
      if(godzina[0]=='1')
	{
	  dodaj_kurs(width, godzina, typ, cala, tab_2);
	}
      else if(godzina[0]=='2')
	dodaj_kurs(width, godzina, typ, cala, tab_3);
    }
  dane.close();
}


std::vector<QWidget *> adresy_kursow;
void dodaj_kurs(float width, std::string informacje, std::string typ_zajec, std::string tresc, QWidget *tab_2)
{

  std::string info = informacje;
  int wys_pocz = 0;
  if(informacje[1]=='0')
    wys_pocz=28;
  else if(informacje[1]=='1')
    wys_pocz=148;
  else if(informacje[1]=='2')
    wys_pocz=268;
  else if(informacje[1]=='3')
    wys_pocz=388; 
  else if(informacje[1]=='4')
    wys_pocz=508;

  std::string czas = informacje.erase(0,2);
  std::string poczatek = "0730" + czas.substr(0, 4);
  int dlugosc = diff(czas);
  dlugosc /= 60;
  float szer_linii = ((width-100)/55)/15;

  int pocz_czas = diff(poczatek)/60;

  float tmp = pocz_czas*szer_linii;
  QLabel *tekst;
  QWidget *widget = new QWidget(tab_2);
  widget->setObjectName(QStringLiteral("widget"));
  widget->setGeometry(QRect(61 + tmp, wys_pocz, (szer_linii*dlugosc) , 120));
  int t1 = typ_zajec.find("Wykład");
  int t2 = typ_zajec.find("Ćwiczenia");
  int t3 = typ_zajec.find("Zajęcia laboratoryjne");
  int t4 = typ_zajec.find("Projekt");
  int t5 = typ_zajec.find("Seminarium");
  int t6 = typ_zajec.find("Inne");
  if(t1>=0)
    widget->setStyleSheet(QLatin1String("background-color: #00a65a;\n"
					"    border: 1px solid #00a65a;\n"
					"    opacity: 0.85;"));
  else if(t2>=0)
    widget->setStyleSheet(QLatin1String("background-color: #f39c12;\n"
					"    border: 1px solid #f39c12;\n"
					"    opacity: 0.85;"));
  else if(t3>=0)
    widget->setStyleSheet(QLatin1String("background-color: #3c8dbc;\n"
					"    border: 1px solid #3c8dbc;\n"
					"    opacity: 0.85;"));
  else if(t4>=0)
    widget->setStyleSheet(QLatin1String("background-color: #00c0ef;\n"
					"    border: 1px solid #00c0ef;\n"
					"    opacity: 0.85;"));
  else if(t5>=0)
    widget->setStyleSheet(QLatin1String("background-color: #45b6b0;\n"
					"    border: 1px solid #45b6b0;\n"
					"    opacity: 0.85;"));
  else if(t6>=0)
    widget->setStyleSheet(QLatin1String("background-color: #000;\n"
					"    border: 1px solid #000;\n"
					"    opacity: 0.85;"));


  tekst = new QLabel(widget);
  tekst->setObjectName(QStringLiteral("tekst"));
  tekst->setGeometry(QRect(0, 0, szer_linii*dlugosc, 120));
  tekst->setStyleSheet(QStringLiteral("color: rgb(255, 255, 255);"));
  tekst->setAlignment(Qt::AlignCenter);
  tekst->setWordWrap(true);    
  QString qs = QString(tresc.c_str());
  tekst->setText(qs);
  adresy_kursow.push_back(widget);
}

Zmieniłem na ' connect(watcher, &QFileSystemWatcher::directoryChanged, this, &MainWindow::aktualizuj);', ale nic nie zmieniło. Ogólnie bawię się programowaniem dla frajdy i na własne potrzeby, a w qt jestem całkowicie zielony. Dzięki za odzew!

0

Zakładając, że tab_2 to QTabWidget to gdzie dodajesz nowo utworzony widget do niego i gdzie usuwasz stary (jeśli jakiś jest)?

Jeśli chodzi o syntax connect, to jest to po prostu dobra praktyka (umożliwiająca wyłapanie części błędów na etapie kompilacji).

0
 tab_2 = new QWidget();

nowy widget dodaję tutaj:

  QWidget *widget = new QWidget(tab_2);

A do usuwania mam funkcję:

 void wyczysc_kursy()
{
  QWidget *tmp;
  for( size_t i = 0; i < adresy_kursow.size(); i++ )
    {
      tmp = adresy_kursow.at(i);
      delete tmp;
    }
  adresy_kursow.clear();
}
2

Tutaj tworzysz nowy obiekt. Gdzie go ustawiasz w tab_2? Tutaj jest dokumentacja: http://doc.qt.io/qt-5/qtabwidget.html

@MarekR22 może mnie poprawić, ale ja to widzę tak:

dodanie pierwszego dziecka dla QWidget ma specjalne znaczenie i jest on ustawiany w QTabWidget jako aktywny. Dlatego za pierwszym razem działa. Wszystkie kolejne już nie.

0
  1. czy umiesz używać Debuggera? Jeśli nie to zacznij od nauczenia się tego. Jest to proste i niezbędne narzędzie. Nie musisz znać wszystkich wodotrysków, podstawowa funkcjonalnosć powinna ci wystarczyć.
  2. Czemu nie używasz QTableWidget? Po co sobie uprzykrzać życie.
  3. Tak się nie używa styleSheet. W standardowych przypadkach powinno się to ustawiać tylko i wyłącznie na QApplication by aplikacja miała jednolity wygląd. Na widget ustawia się tylko w szczególnych przypadkach (do testów).
  4. Czy twoja aplikacja nie zmienia katalogu?
  5. Szczerze strasznie się czyta twój kod, może popatrzę na niego dokładniej wieczorem.
0

Nie wiem za bardzo, jak mam go 'ustawić'. Dokumentacją przejrzałem, ale nic mi się nie rzuciło w oczy. Mógłbyś powiedzieć, jak go ustawiać jako aktywny za każdym razem?

Co do debuggera to nie bardzo, kiedyś coś próbowałem, ale za wiele nie osiągnąłem. Póki się da, to jakoś staram sobie radzić bez niego, choć któregoś dnia będę musiał do tego przysiąść.
QTableWidget nie wygląda, jak bym tego oczekiwał.
StyleSheet tak ustawiłem, bo najpierw 'bawiłem się' w Creatorze, była tak opcja i ją wykorzystałem.
Aplikacja cały czas działa w tym samym katalogu.
Jestem praktycznie zielony w programowaniu, ale staram się nad tym pracować. Za mną raptem pół roku programowania (na studiach), więc było to kilka programików. Z czasem powinno to wyglądać lepiej.

EDIT: Dobra, znalazłem opcję w dokumentacji QWidget. Dziękuję bardzo za pomoc.

0

Za dokumentacją:

The normal way to use QTabWidget is to do the following:

1. Create a QTabWidget.
2. Create a QWidget for each of the pages in the tab dialog, but do not specify parent widgets for them.
3. Insert child widgets into the page widget, using layouts to position them as normal.
4. Call addTab() or insertTab() to put the page widgets into the tab widget, giving each tab a suitable label with an optional keyboard shortcut.

http://doc.qt.io/qt-5/qtabwidget.html

1
diego962 napisał(a):

Co do debuggera to nie bardzo, kiedyś coś próbowałem, ale za wiele nie osiągnąłem. Póki się da, to jakoś staram sobie radzić bez niego, choć któregoś dnia będę musiał do tego przysiąść.

Najwyraźniej jesteś masochistą.
Debugger w Qt creator powinien działać Out of the box. Wystarczy tylko wybrać tryb budowania Debug i wystartować aplikację strzałką z robalem.

0

Mówiłem o debuggerze ogólnie, nie w QT. W QT piszę siedzę raptem parę dni.

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