Qt - optymalizacja kodu

Odpowiedz Nowy wątek
2015-10-25 19:28

Rejestracja: 5 lat temu

Ostatnio: 3 lata temu

0

Witam, piszę do was z zapytaniem, o zasugerowanie mi jak mógłbym z optymalizować kod programu, na razie rozchodzi mi się o QCheckBox. Mam ich w programie prawie 60. Nie tworzę ich w Designerze tylko od razu w kodzie. Do każdego checkbox'a potrzebuję 3 linijek aby go stworzyć, ustawić ikonę i rozmiar ikony. I jak można zauważyć (60 * 3) już jest 180 linijek kodu. Jest jakiś sposób aby to zoptymalizować ??

Rozchodzi mi się o te 3 linijki :

nazwaProgramu4 = new QCheckBox("JakasNazwaProgramu");
    nazwaProgramu4 ->setIcon(QIcon(":/icon/icon/programs/ikona-do-jakiegos-programu.ico"));
    nazwaProgramu4 ->setIconSize(QSize(32, 32));

Z góry dzięki

Pozostało 580 znaków

2015-10-25 20:10

Rejestracja: 7 lat temu

Ostatnio: 2 dni temu

Lokalizacja: Wrocław

3

Robisz:

std::map<std::string, QCheckBox *> 

(lub jakiś odpowiednik z Qt), i wtedy klucz masz string (np. "nazwaProgramu4"), a wartością jest wskaźnik na QCheckBox.
Dodatkowo nazwę checkboxa, ikonę, i rozmiary ikony trzymasz w jakimś arrayu, i pętlą tworzysz i dodajesz do mapy. Np.:

struct CheckBoxDesc
{
 const char *m_name;
 const char *m_text;
 const char *m_icon;
 unsigned m_icon_w;
 unsigned m_icon_h;
};
const CheckBoxDesc checkboxes[] = {
 { "nazwaProgramu4", "JakasNazwaProgramu", ":/icon/icon/programs/ikona-do-jakiegos-programu.ico", 32, 32 }
 { "nazwaProgramu5", "JakasNazwaProgramu2", ":/icon/icon/programs/ikona-do-jakiegos-programu2.ico", 64, 64 }
 { "nazwaProgramu6", "JakasNazwaProgramu3", ":/icon/icon/programs/ikona-do-jakiegos-programu3.ico", 128, 128 }
 // ...
};
const unsigned numCheckboxes = sizeof(checkboxes) / sizeof(checkboxes[0]);
// ...
for(unsigned i = 0; i < numCheckboxes; ++i)
{
 QCheckBox *checkbox = new QCheckBox(checkboxes[i].m_text);
 checkbox->setIcon(QIcon(checkboxes[i].m_icon));
 checkbox->setIconSize(QSize(checkboxes[i].m_icon_w, checkboxes[i].m_icon_h));
 checkboxMap[checkboxes[i].m_name] = checkbox;
}

Asm/C/C++
edytowany 6x, ostatnio: mwl4, 2015-10-25 20:21

Pozostało 580 znaków

2015-10-26 10:06

Rejestracja: 5 lat temu

Ostatnio: 3 lata temu

0

@mwl4 , dzięki kod działa tylko mam problem z pętlą for dodającą QCheckBox'y do layout'u. Mianowicie podczas kompilacji wyskakuje błąd że znak [ nie może być przed zmienną QString

for(int i = 4; i < 7; i++)
    {
        QString test = "nazwaProgramu" + QString::number(i);
        qDebug() << test;
        layout->addWidget(checkboxMap[test]);
    }
a czym jest checkboxMap? - Azarien 2015-10-26 10:43
@Azarien std::map<std::string, QCheckBox *> checkboxMap; - maniek1310 2015-10-26 10:51

Pozostało 580 znaków

2015-10-26 10:54

Rejestracja: 6 lat temu

Ostatnio: 1 tydzień temu

Zmienna 'test' jest typu Qstring, a mapę zadeklarowałeś na std::string.

Pozostało 580 znaków

2015-10-26 11:16

Rejestracja: 5 lat temu

Ostatnio: 3 lata temu

0

@xfin, masz rację wystarczyło zmienić std::string na QString :D

Ale w qt zamiast używać std::map wolę QMap;

QMap<QString, QCheckBox *> checkboxMap;
edytowany 1x, ostatnio: maniek1310, 2015-10-26 11:19
@maniek1310 Oczywiście też masz rację. Ja generalnie staram się nie mieszać bibliotek std i Qt. Jak coś ma odpowiednik to używaj ;) - xfin 2015-10-26 11:24
No właśnie a zważywszy na to że w Qt wszystko jest prostsze, zamiast wypisywać elementy std::map za pomocą pętli for, w Qt robi się to automatycznie. Wystarczy użyć QMapIterator. - maniek1310 2015-10-26 11:33
A to w standardowej bibliotece nie ma iteratorów? Już nie wspominając, że i tak musisz użyc pętli, więc nie bardzo rozumiem ani gdzie ta "automatyka" ani co jest tam takie "prostsze". :P - Xupicor 2015-10-26 13:08

Pozostało 580 znaków

Odpowiedz

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