Hermetyzacja w QT

0

Jak chce sobie narysowac Widget w MaainWindow W QT Creator, to robie:

ui->gridLayout->addWidget(&tab[i][j].but,i,j);

a jak chce to zrobic z metody innej klasy ?
to co ma byc zamiast: ui->gridLayout->addWidget(&tab[i][j].but,i,j); ??

oraz gdy tworze obiekt innej klasy w MainWindow

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

  
   plan = Plan();  //dlaczego tu blad, ze operator przypisania prywatny, jak to obejsc, by mozna bylo tak zrobic ?


}

 
0

żeby mieć dostęp do 'formatki' z innej klasy musisz w jakiś sposób przekazać do niej wskaźnik przez, który odnosisz się do niej z MainWindow. Czyli "ui".

Co do tego przypisania "plan = Plan();" to trudno powiedzieć co chcesz zrobić. Plan() to konstruktor klasy? (w takim razie masz źle), to jest jakaś metoda, która coś zwraca (jakiś obiekt?) jeśli tak to co. Pokaż jej definicję lub przynajmniej deklarację.

0

W hermetyzacji chodzi o to, że ukrywasz przed użytkownikiem klasy pewną funkcjonalność lub jej cześć.
Np.
ty tworzysz planszę z tych guzików QSpeedButton. Jednak użytkownikowi klasy nie pokazujesz, że tam używasz QSpeedButton, ale za to pozwalasz mu zmienić wielkość planszy, wystawiając metodę (lub slot):

void setBoardSize(int size);

Sprecyzuj co chcesz zrobić, a nie jak coś chcesz zrobić, bo na podstawie twojego opisu nic więcej powiedzieć się nie da.

0

zauzmy ze mam klase MainWindow zawierajaca ui (wygenerowana przez creator)

i teraz sobie tworze klase Piłka

jak zrobic by miec w kalsie Pilka dostep do ui (aby moc rysowac) ?

domyslam sie ze jakos w konstruktorze klasy Pilka zrobic drugi wskaznik na to samo, ale jak ?

0

możesz to zrobić na kilka sposobów:

  • przekazać do konstruktora nowej klasy "ui" (czyli w twoim wypadku wskaźnik na typ Ui::MainWindow)
  • przekazać do konstruktora nowej klasy "this" (czyli w twoim wypadku wskaźnik na MainWindow) i odnosić się do "ui" przez zeń (lecz w tym wypadku musisz zadeklarować przyjaźń między klasami bo "ui" jest private albo wyrzucić "ui" do sekcji public)

te rozwiązania nie podobają mi się osobiście ale zadziałają. Według mnie powinieneś stworzyć sobie metodę która jako argument przyjmie wskaźnik na jakiś tam obiekt, który cie interesuje i tą metodą sobie nim manipulować, czyli przykładowo chcesz mieć dostęp do buttona za pomocą jakieś metody z innej klasy, robisz to mniej więcej tak:

class Inna{
  (...)
  public:
     void metoda(QPushButton*); //i w niej robisz co chcesz
}

a wywołujesz ją w klasie MainWindow przykładowo tak:

Inna obj;
obj.metoda(ui->nazwa_buttona);

Nie wiem po co ci to ale tak można by zrobić.
pozdrawiam

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