2012-03-13 9 views
6

Czytałem o strukturze modelu/widoku Qt. Uważam, że jest to bardzo pomocne przy pracy z danymi tabelarycznymi, takimi jak tabele z bazy danych. Moje pytanie brzmi: czy będzie użyteczne dla danych innych niż tabelowe, takich jak lista właściwości, czy tylko kilka grup różnych typów? Jeśli tak, jak mam się do tego zbliżyć?Używanie Qt Model/View z danymi niepodobnymi do tabeli i interfejsem innym niż tabela/lista?

Celem jest stworzenie edytora dla niektórych list nieruchomości, takich jak dane. Lista jest tworzona w czasie wykonywania, a elementy są różnych typów (liczby, łańcuchy, booleany i ścieżki plików, aby wymienić tylko kilka). Każdy element to w zasadzie para nazwa-wartość. Nazwa, typ i ograniczenia (na przykład ograniczenia) dla każdego elementu są definiowane podczas kompilacji. Zostaną one zmontowane w czasie wykonywania na różne listy w zależności od danych wprowadzanych przez użytkownika. Lista elementów może się zmienić podczas sesji edycji.

Interfejs użytkownika najprawdopodobniej będzie kombinacją różnych wstępnie zaprojektowanych widgetów złożonych zgodnie z danymi wprowadzonymi przez użytkownika. Nie mogą to być widoki listy ani tabel.

Niektóre wskaźniki do wzoru lub przykładów są również mile widziane. Dzięki.

Odpowiedz

3

Nie widzę problemu z ramką MVC w QT, aby to zrobić.

Zasadniczo różnica między standardowym wyświetlaczem tabeli i to jest to, że stworzenie listy dynamicznie podobny do mapy:

QMap<QString, QVariant> property_map; 

można zrobić:

QList<std::pair<QString, QVariant>> property_list; 

które można następnie użyj, aby wyświetlić w tabeli właściwość. Najlepszym sposobem będzie prawdopodobnie:

struct { 
    QString prop_name; 
    int prop_type; 
    QVariant prop_value; 
}; 

QVariant zasadzie zapewni Ci jedną klasę abstrakcji do przechowywania danych i to jest rzeczywiście to, co jest zwracana przez funkcję data() wewnątrz QAbstractItemModel który może być reimplementing.

Więc w zasadzie wziąłeś listę właściwości i sprowadziłeś ją do tej samej tabeli, co dane w bazie danych.

zmienionego

Jeśli masz widget, który chcesz mieć ten widget zaludnionych z innymi gotowych widgetów całkiem prawdopodobne, że wiele problemów, chyba że widgety są z tego samego lub dobrze zdefiniowanej wielkości.

Co możesz zrobić w sobie? Widget ekranu definiuje układ, taki jak: QGridLayout lub inne możliwe układy, a następnie dodaje do niego inne widżety, używając zestawu parametrów, które można wykonać, ale może być nieco uciążliwy.

Innym rozwiązaniem, które możesz zastosować, jest umieszczenie wszystkich widgetów właściwości z góry w interfejsie wyświetlacza i po prostu włącz potrzebne elementy, a reszta jest wyłączona, ale ma to zastosowanie tylko wtedy, gdy masz zdefiniowaną ograniczoną liczbę pre -projektowane widżety.

+0

Dziękuję za odpowiedź. Ale moje pytanie dotyczy użycia struktury Qt Model View z interfejsem NON-table. Podobnie jak widżety utworzone i ułożone w układach. Wariant jest jednak dobrym pomysłem. –

2

Od dłuższego czasu używam architektury Model/View i zazwyczaj implementuję własne modele z zapleczem opartym na kontenerach Qt (wektory, listy itp.). Nawet jeśli dane ostatecznie pochodzą z bazy danych, praca z (na przykład) wektorem identyfikatorów danych może znacznie poprawić wydajność (a czasami jest to jedyny sposób, jaki możesz zrobić).

This trivial example z docs Qt (patrz „Tworzenie niestandardowego modelu) jest punkt, w którym zacząłem i pokazuje, jak korzystać z QStringList jako backend dla niestandardowego modelu.

Po zdefiniowaniu modelu można zdefiniować niestandardową Widoki, które będą narysować rozmieszczone widżety na podstawie zawartości pod spodem modelu Gdy model się zmieni, widok odpowiednio się zmieni, jeśli to konieczne, zmieniając widżety. Wykorzystując możliwości, jakie daje możliwość wyświetlania odpowiedniego widżetu dla każdego typu danych (np. QSpinBox dla float a QComboBox dla QStringList, i tak dalej ...)

+0

Dzięki za wskazanie QVariant. Ale moje pytanie dotyczy korzystania z frameworka z danymi nie-tabelowymi i interfejsem użytkownika. Przepraszam, że nie wyjaśniłem tego. –

+0

Ok, potrzebujesz tylko zdefiniować własne widoki, wywodząc klasę podstawową przez model/view framework. Przykładem może być QAbstractItemView: można renderować widżety w obszarze przewijania zgodnie z zawartością modelu pod spodem. – Masci

+0

zredagowałem odpowiednio odpowiedź – Masci

Powiązane problemy