Dynamiczna wielkość okna QDialog

Dynamiczna wielkość okna QDialog
QT
  • Rejestracja:ponad 11 lat
  • Ostatnio:około 11 lat
  • Postów:37
0

Witam ponownie :)

Chciałbym się zapytać, czy znacie funkcje, które pozwalają na to, aby rozmiar okna dostosował się do wielkości obiektu lub obiektów w nim. W obecnej chwili muszę okno rozciągnąć, aby zobaczyć cały obiekt. Dodam, że obiektem w QDialog jest MÓJ własny obiekt. Jest to zlepek QLabel i dwóch QRadioButton zawarłem go w QGroupBox. Obiekty te również umieszczam w oknie QDialog za pomocą QGridLayout

EM
  • Rejestracja:prawie 13 lat
  • Ostatnio:ponad 10 lat
  • Postów:271
0

Mam u siebie bardzo podobna sytuację to znaczy QDialog, w nim QGroupBox i dynamicznie dodaje obiekty do okna dialogowego a ono dostosowuje swój rozmiar do zawartości...

Spróbuj ustawić w dialogu który jak mówisz ma QGridLayout opcje sizePolicy na expanding

MarekR22
Moderator C/C++
  • Rejestracja:około 17 lat
  • Ostatnio:2 minuty
0

Jeśli zrobiłeś poprawnie layouty to powinno wystarczyć:

Kopiuj
dialog->setSize(dialog->sizeHint());

możesz też zmienić sizePolicy na QSizePolicy::Minimum albo QSizePolicy::Fixed albo ... http://qt-project.org/doc/qt-5.0/qtwidgets/qsizepolicy.html#Policy-enum.


Jeśli chcesz pomocy, NIE pisz na priva, ale zadaj dobre pytanie na forum.
QT
  • Rejestracja:ponad 11 lat
  • Ostatnio:około 11 lat
  • Postów:37
0

coś mi to nie śmiga. W konstruktorze okna QDialog pisze:

this->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
i nic się nie dzieje. Z kolei poniższy zapis:
this->setSizePolicy(QSizePolicy::Expanding);

Wyskakuje błąd, że
c:\QtSDK\Desktop\Qt\4.8.1\mingw\include\QtGui\qsizepolicy.h:202: błąd:'QSizePolicy::QSizePolicy(int)' is private

MarekR22
Moderator C/C++
  • Rejestracja:około 17 lat
  • Ostatnio:2 minuty
0
  1. Poczytaj linka którego ci dałem, może bardziej potrzebujesz QSizePolicy::Minimum
  2. zapewne masz manualnie ustawiony rozmiar okna w designerze, we właściwościach okna znajdź size wyczyść wartość (jeśli dobrze pamiętam to pojawia się odpowiedni przycisk by to zrobić, gdy właściwość jest podświetlona; jak nie to taka opcja jest pod prawym przyciskiem myszy).

Jeśli chcesz pomocy, NIE pisz na priva, ale zadaj dobre pytanie na forum.
edytowany 2x, ostatnio: MarekR22
QT
  • Rejestracja:ponad 11 lat
  • Ostatnio:około 11 lat
  • Postów:37
0

Co do linka to jestem w trakcie czytania.
Co do drugiej sugestii. Nie pisze przy pomocy desingera. Działam tylko w Qt creator, sam wszystko tworząc, zatem jak wykonać to programowo o czym wspomniałeś ?

MarekR22
designer to cześć Qt Creatora (wtyczka). To ta cześć, w której myszką układasz widgety i layouty na oknie.
QT
Wiem co to:) i właśnie tego nie używam. Wszystko pisze sam.
MarekR22
w takim razie pierwszy mój post powinien rozwiązać problem: dialog->setSize(dialog->sizeHint());.
QT
  • Rejestracja:ponad 11 lat
  • Ostatnio:około 11 lat
  • Postów:37
0

zadziałało coś takiego
this->setFixedSize(this->width(),this->height());
Jednak nie ma to chyba nic wspólnego z QSizePolicy :|

MarekR22
Moderator C/C++
  • Rejestracja:około 17 lat
  • Ostatnio:2 minuty
0

najwyraźniej nie opisałeś dokładnie co chcesz osiągnąć.
Jeśli w swoim dialogu masz dynamiczną zawartość to ta linijka ustala twardo i na stałe wielkość okna i zmiana zawartości okna nie zmieni rozmiaru okna.


Jeśli chcesz pomocy, NIE pisz na priva, ale zadaj dobre pytanie na forum.
QT
  • Rejestracja:ponad 11 lat
  • Ostatnio:około 11 lat
  • Postów:37
0

Chciałem, aby rozmiar okna Qdialog dostosowywał się do zawartości, która zależy ode mnie. Czyli jak mamy np obiekt o rozmiarach 150x50 a ja stworze takich obiektów 3 i to wszystkie w QGroupBox jako QHboxLayout no to okno powinno mieć ~(3*150)H i ~50V. A działo się tak, że nowo powstałe okno było tak małe, że zakrywało wszystkie elementy, ale widoczne były przyciski ZAPISZ i ANULUJ (o tym zapomniałem napisać) stworzone w klasie tego okna. Być może wynika z tego to, że QPushButton ja i inne obiekty, które są już zdefiniowane w qt posiadają włączoną jakąś opcje, która powoduje, że rozmiar okna się dopasowuje do nich jeśli tylko są w jakimś layout.

MarekR22
Moderator C/C++
  • Rejestracja:około 17 lat
  • Ostatnio:2 minuty
0

Bardzo dziwne jest to co piszesz. Napisałem sobie taką kalsę próbę:

Kopiuj
class MyDialog : public QDialog
{
    Q_OBJECT

    QBoxLayout *layout;

public:
    explicit MyDialog(QWidget *parent = 0);

signals:

public slots:
    void addItem();
};

MyDialog::MyDialog(QWidget *parent) :
    QDialog(parent, Qt::Window|Qt::Dialog)
{
    layout = new QBoxLayout(QBoxLayout::TopToBottom, this);

    QPushButton *button = new QPushButton("Add next item", this);
    layout->addWidget(button);
    connect(button, SIGNAL(clicked()),
            this, SLOT(addItem()));
}

void MyDialog::addItem()
{
    QLabel *label = new QLabel(QString("Item %1").arg(layout->count()), this);
    layout->addWidget(label);
}

I rozmiar dialogu zmienia mi się automatycznie, po każdym kliknięciu przycisku, bez jakichkolwiek dodatkowych kombinacji, wiec nie rozumiem z czym masz kłopot.


Jeśli chcesz pomocy, NIE pisz na priva, ale zadaj dobre pytanie na forum.
QT
  • Rejestracja:ponad 11 lat
  • Ostatnio:około 11 lat
  • Postów:37
0

No to ja robię to tak. Klasa MOJEGO obiektu (dwa radiobutton + label)

plik nagłówkowy:

Kopiuj
#include <QGridLayout>
#include <QRadioButton>
#include <QGroupBox>
#include <QHBoxLayout>
#include <QWidget>
#include <QSizePolicy>

class obiektnowegozlec : public QWidget
{
    Q_OBJECT
public:

    QRadioButton *tak , *nie;
    QLabel *trescpytan;
    QGroupBox *grupa;
    QHBoxLayout *Hbox;
    QString tresc_pyt;


    obiektnowegozlec(QString tresc_pyt, QWidget *parent=0);

    void tworzenie();


    
signals:
    
public slots:
    
};

#endif // OBIEKTNOWEGOZLEC_H

plik źródłowy.

Kopiuj
#include "obiektnowegozlec.h"
#include "oknogl.h"

obiektnowegozlec::obiektnowegozlec(QString tresc_pyt, QWidget *parent) : QWidget(parent), tresc_pyt(tresc_pyt)
{
    tworzenie();

}

void obiektnowegozlec::tworzenie()
{
    tak = new QRadioButton("TAK" , this);
    nie = new QRadioButton("NIE" , this);
    trescpytan = new QLabel(tresc_pyt , this);
    trescpytan->setWordWrap(true);
    trescpytan->setFixedSize(150,50);
    tak->setChecked(true);

    grupa = new QGroupBox(this);
    Hbox = new QHBoxLayout;

    Hbox->addWidget(trescpytan);
    Hbox->addWidget(tak);
    Hbox->addWidget(nie);

    grupa->setLayout(Hbox);

}

I teraz stworzenie kilkunastu obiektów w klasie NoweZlecenie dziedziczącej po QDialog. Stworzenie odbywa się w funkcji, zamieszczam tutaj tylko jej ciało. W Ciele, ustalam, jaka ma być ilość obiektów. Tworzone są jako wskaźnik na tablice wskaźników. O il ilości decyduje zmienna w innej klasie. W zależności od tego czy zmienna 'of' ma wartość 1 czy inną uruchamiam odpowiednie własne makro.

Kopiuj
void NoweZlecenie::dodanieobiektow()
{
    if(of==1)
    {

        wsk->obsql->Oper_FORMULARZ(sql::ZCZYTANIE_PYTAN_PODS);

        obiekt = new obiektnowegozlec*[wsk->obsql->zmiennatablform];
        int i;


        for(i = 0 ; i<wsk->obsql->zmiennatablform ; i++)
        {
            obiekt[i] = new obiektnowegozlec(wsk->obsql->trescpytsql[i] ,this);

        }
    }
    else
    {

        wsk->obsql->Oper_FORMULARZ(sql::ZCZYTANIE_PYTAN_ROZSZ);
        obiekt = new obiektnowegozlec*[wsk->obsql->zmiennatablform];
        int i;
        for(i = 0 ; i<wsk->obsql->zmiennatablform ; i++)
        {
            obiekt[i] = new obiektnowegozlec(wsk->obsql->trescpytsql[i], this);
        }
    }

No i tutaj wreszcie funkcja dająca wszystko do QGridLayout. Funkcja działa w zależności od warunku tworzy kolumny obiektów w tym wypadku po 5. Można to oczywiście zmienić. Jak widać ilość obiektów jest ograniczona. Proszę przyjrzyj się.

Kopiuj
void NoweZlecenie::gridlaj()
{
    lajout = new QGridLayout(this);
    int i;
    for(i=0 ; i<wsk->obsql->zmiennatablform ; i++)
    {

        if(i<=5)
        {

            lajout->addWidget(obiekt[i], i , 0);


        }
        else if(i<=11)
        {
            lajout->addWidget(obiekt[i], i-6 , 1);

        }
        else if(i<=17)
        {
            lajout->addWidget(obiekt[i], i-12 , 2);

        }
        else if(i<=23)
        {
            lajout->addWidget(obiekt[i], i-18 , 3);

        }

    }

    lajout->addWidget(boxp,11,0); // boxp to QGroupbox + QHboxLayout są to dwa przyciski anul i zapisz to właśnie one się nie "chowały"
    this ->setLayout(lajout);

}
edytowany 1x, ostatnio: QTPomocy
MarekR22
Moderator C/C++
  • Rejestracja:około 17 lat
  • Ostatnio:2 minuty
0

No i problem widać jak na dłoni. Twój widget obiektnowegozlec nie ma połączania layoutem z grupa (nie żadnego skojarzenia rozmiarów między tymi obiektami).
Są dwa rozwiązania:

  1. na szybkiego dodać brakujący layout (jakikolwiek)
  2. albo pozbyć się jednego piętra zależności (zbędnego) i dziedziczyć po QGroupBox a nie po QWidget (wtedy pole grupa jest zbędne).

Jeśli chcesz pomocy, NIE pisz na priva, ale zadaj dobre pytanie na forum.
QT
  • Rejestracja:ponad 11 lat
  • Ostatnio:około 11 lat
  • Postów:37
0

Faktycznie zadziałało :) Użyłem sposobu drugiego. Odziedziczyłem po QGroupBox. Jednak z uwagi na Twoją pomoc czuję się trochę jakbym nacisnął guzik, a 1000 km dalej wyleciało coś w powietrze bez mojej świadomości :)
Mógłbyś wytłumaczyć mi ten mechanizm, dokładniej ? drugi sposób chyba łapie bardziej, a rozumiem go tak:

Tworząc obiekt w mojej własnej klasie obiektnowegozlec :
QGroupbox grupa = new QGropuBox(this)
Słówko this jest kluczowe, ponieważ wtedy tworze obiekt jakby w TYM widzecie w klasie obiektnowegozlec, a nie w TYM oknie QDialog, dlatego QDialog nie widzi mojego widzetu jako typowe dziecko. Jeśli odziedziczę po QGropuBox klasa stanowi całkowity obiekt, który chce umieścić w QDialog. Czy tak?

Sposób 1 tzn dodać Layout na szybko. Miałeś na myśli np stworzyć QBoxLayout w obiektnowegozlec wrzucić to wszystko do niego i wtedy stworzyć w QDialog?

ps. dziękuje bardzo za kolejną trafną radę.

edytowany 1x, ostatnio: QTPomocy
MarekR22
Moderator C/C++
  • Rejestracja:około 17 lat
  • Ostatnio:2 minuty
0

Widget normalnie nie zarządza wielkością swoich dzieci. Jeśli zmienia się jego rozmiar nie przesuwa ani nie zmiana rozmiaru dzieci. Widget swój preferowany rozmiar zwraca za pomocą metody wirtualnej sizeHint. Domyślnie zwraca to wartość (50,50) (chyba, że masz layouta). Bez layouta, to jawny kod jest odpowiedzialny za obliczanie sizeHint oraz zarządzanie pozycją i rozmiarem dzieci
Jeśli ustawiasz layout na widget'cie to widget zrzeka się zarządzania swoimi dziećmi na rzecz layout-a. Widget zwraca sizeHint obliczny przez layout i to layout ustawia pozycję i rozmiar dzieci.
Layout to po prostu gotowy kawałek kodu,który wykonuje obliczanie związane z pozyją i rozmiarem.

Jeśli twój widget nie ma layouta, to nie zwraca właściwego sizeHint, w wyniku czego, właściwa wielkość nie propaguje się do niższych warstw aż do samego okna i dlatego okno ostatecznie przybrało niewłaściwy rozmiar.


Jeśli chcesz pomocy, NIE pisz na priva, ale zadaj dobre pytanie na forum.
edytowany 1x, ostatnio: MarekR22
QT
  • Rejestracja:ponad 11 lat
  • Ostatnio:około 11 lat
  • Postów:37
0

Dziękuje za pomoc. Wszystko jasne w tej kwestii. Uważam temat za wyczerpany.
Pozdrawiam

Kliknij, aby dodać treść...

Pomoc 1.18.8

Typografia

Edytor obsługuje składnie Markdown, w której pojedynczy akcent *kursywa* oraz _kursywa_ to pochylenie. Z kolei podwójny akcent **pogrubienie** oraz __pogrubienie__ to pogrubienie. Dodanie znaczników ~~strike~~ to przekreślenie.

Możesz dodać formatowanie komendami , , oraz .

Ponieważ dekoracja podkreślenia jest przeznaczona na linki, markdown nie zawiera specjalnej składni dla podkreślenia. Dlatego by dodać podkreślenie, użyj <u>underline</u>.

Komendy formatujące reagują na skróty klawiszowe: Ctrl+B, Ctrl+I, Ctrl+U oraz Ctrl+S.

Linki

By dodać link w edytorze użyj komendy lub użyj składni [title](link). URL umieszczony w linku lub nawet URL umieszczony bezpośrednio w tekście będzie aktywny i klikalny.

Jeżeli chcesz, możesz samodzielnie dodać link: <a href="link">title</a>.

Wewnętrzne odnośniki

Możesz umieścić odnośnik do wewnętrznej podstrony, używając następującej składni: [[Delphi/Kompendium]] lub [[Delphi/Kompendium|kliknij, aby przejść do kompendium]]. Odnośniki mogą prowadzić do Forum 4programmers.net lub np. do Kompendium.

Wspomnienia użytkowników

By wspomnieć użytkownika forum, wpisz w formularzu znak @. Zobaczysz okienko samouzupełniające nazwy użytkowników. Samouzupełnienie dobierze odpowiedni format wspomnienia, zależnie od tego czy w nazwie użytkownika znajduje się spacja.

Znaczniki HTML

Dozwolone jest używanie niektórych znaczników HTML: <a>, <b>, <i>, <kbd>, <del>, <strong>, <dfn>, <pre>, <blockquote>, <hr/>, <sub>, <sup> oraz <img/>.

Skróty klawiszowe

Dodaj kombinację klawiszy komendą notacji klawiszy lub skrótem klawiszowym Alt+K.

Reprezentuj kombinacje klawiszowe używając taga <kbd>. Oddziel od siebie klawisze znakiem plus, np <kbd>Alt+Tab</kbd>.

Indeks górny oraz dolny

Przykład: wpisując H<sub>2</sub>O i m<sup>2</sup> otrzymasz: H2O i m2.

Składnia Tex

By precyzyjnie wyrazić działanie matematyczne, użyj składni Tex.

<tex>arcctg(x) = argtan(\frac{1}{x}) = arcsin(\frac{1}{\sqrt{1+x^2}})</tex>

Kod źródłowy

Krótkie fragmenty kodu

Wszelkie jednolinijkowe instrukcje języka programowania powinny być zawarte pomiędzy obróconymi apostrofami: `kod instrukcji` lub ``console.log(`string`);``.

Kod wielolinijkowy

Dodaj fragment kodu komendą . Fragmenty kodu zajmujące całą lub więcej linijek powinny być umieszczone w wielolinijkowym fragmencie kodu. Znaczniki ``` lub ~~~ umożliwiają kolorowanie różnych języków programowania. Możemy nadać nazwę języka programowania używając auto-uzupełnienia, kod został pokolorowany używając konkretnych ustawień kolorowania składni:

```javascript
document.write('Hello World');
```

Możesz zaznaczyć również już wklejony kod w edytorze, i użyć komendy  by zamienić go w kod. Użyj kombinacji Ctrl+`, by dodać fragment kodu bez oznaczników języka.

Tabelki

Dodaj przykładową tabelkę używając komendy . Przykładowa tabelka składa się z dwóch kolumn, nagłówka i jednego wiersza.

Wygeneruj tabelkę na podstawie szablonu. Oddziel komórki separatorem ; lub |, a następnie zaznacz szablonu.

nazwisko;dziedzina;odkrycie
Pitagoras;mathematics;Pythagorean Theorem
Albert Einstein;physics;General Relativity
Marie Curie, Pierre Curie;chemistry;Radium, Polonium

Użyj komendy by zamienić zaznaczony szablon na tabelkę Markdown.

Lista uporządkowana i nieuporządkowana

Możliwe jest tworzenie listy numerowanych oraz wypunktowanych. Wystarczy, że pierwszym znakiem linii będzie * lub - dla listy nieuporządkowanej oraz 1. dla listy uporządkowanej.

Użyj komendy by dodać listę uporządkowaną.

1. Lista numerowana
2. Lista numerowana

Użyj komendy by dodać listę nieuporządkowaną.

* Lista wypunktowana
* Lista wypunktowana
** Lista wypunktowana (drugi poziom)

Składnia Markdown

Edytor obsługuje składnię Markdown, która składa się ze znaków specjalnych. Dostępne komendy, jak formatowanie , dodanie tabelki lub fragmentu kodu są w pewnym sensie świadome otaczającej jej składni, i postarają się unikać uszkodzenia jej.

Dla przykładu, używając tylko dostępnych komend, nie możemy dodać formatowania pogrubienia do kodu wielolinijkowego, albo dodać listy do tabelki - mogłoby to doprowadzić do uszkodzenia składni.

W pewnych odosobnionych przypadkach brak nowej linii przed elementami markdown również mógłby uszkodzić składnie, dlatego edytor dodaje brakujące nowe linie. Dla przykładu, dodanie formatowania pochylenia zaraz po tabelce, mogłoby zostać błędne zinterpretowane, więc edytor doda oddzielającą nową linię pomiędzy tabelką, a pochyleniem.

Skróty klawiszowe

Skróty formatujące, kiedy w edytorze znajduje się pojedynczy kursor, wstawiają sformatowany tekst przykładowy. Jeśli w edytorze znajduje się zaznaczenie (słowo, linijka, paragraf), wtedy zaznaczenie zostaje sformatowane.

  • Ctrl+B - dodaj pogrubienie lub pogrub zaznaczenie
  • Ctrl+I - dodaj pochylenie lub pochyl zaznaczenie
  • Ctrl+U - dodaj podkreślenie lub podkreśl zaznaczenie
  • Ctrl+S - dodaj przekreślenie lub przekreśl zaznaczenie

Notacja Klawiszy

  • Alt+K - dodaj notację klawiszy

Fragment kodu bez oznacznika

  • Alt+C - dodaj pusty fragment kodu

Skróty operujące na kodzie i linijkach:

  • Alt+L - zaznaczenie całej linii
  • Alt+, Alt+ - przeniesienie linijki w której znajduje się kursor w górę/dół.
  • Tab/⌘+] - dodaj wcięcie (wcięcie w prawo)
  • Shit+Tab/⌘+[ - usunięcie wcięcia (wycięcie w lewo)

Dodawanie postów:

  • Ctrl+Enter - dodaj post
  • ⌘+Enter - dodaj post (MacOS)