Ilość widocznych pozycji w zależności od podanej liczby

0

Mam taki oto layout w Qt:
pomysł.png
I chciałabym aby wyświetliło sie tyle pozycji do wpisania oceny (na lewo) ile chce uzytkownik (liczba ocen na prawo).
Jak to uczynić ?

I jak udostepnic uzytkownikowi wpisanie ocen tylko z zakresu od 1 do 6 (nie wiecej nie mniej) ?

1

Użyj QComboBox albo QRegExpValidator z QLineEdit. Osobiście preferowałbym tę drugą opcję

https://doc.qt.io/qt-5/qcombobox.html
https://doc.qt.io/qt-5/qregexpvalidator.html

Co do ilości editów: zrób sobie małą Form Class i twórz tyle jej elementów ile zażyczy sobie użytkownik w pętli. Nie dodawaj ich na sztywno w designerze, to robota głupiego.

0
kq napisał(a):

Co do ilości editów: zrób sobie małą Form Class i twórz tyle jej elementów ile zażyczy sobie użytkownik w pętli. Nie dodawaj ich na sztywno w designerze, to robota głupiego.

Możesz mi wytłumaczyć krok po kroku jak to zrobić ?
To moje pierwsze zderzenie z Qt i aplikacjami okienkowymi i nie wiem jak to mam w kodzie zaimplementować,gdzie itd

0

Pierwszy krok jest opcjonalny, ale ułatwia pracę:
Ctrl+N / Qt / Form Class - tworzysz nowe okienko dziedziczące po QWidget. Dodajesz w nim horizontal layout, albo robisz to na sztywno (layout sensowniejszy), odpowiednie labelki. Dodajesz odpowiednie gettery dla qlineeditów.

W głównym okienku tworzysz sobie QVBoxLayout (albo inny, ale do listy przedmiot-ocena ten się wydaje sensowny) i w pętli dodajesz do niego itemy:

// QVBoxWidget* layoutGrades;
// QLineEdit* numGrades;
int num = numGrades->text().toInt();
for(int i = 0; i < num; ++i) {
    auto w = new SingleGradeForm(this);
    layoutGrades.addWidget(w);
}

To trochę pseudokod, ale w większości Qt.

Zamiast SingleGradeForm możesz tworzyć lokalny QHBoxLayout i w nim odpowiednie QLineEdity ale to jest ble.

PS: nie jestem ekspertem od Qt, możliwe, że jakoś inaczej będzie ładniej.

0

Coś chyba źle robię....
Użyłam spinBoxa do ustalania wartości i w momencie zmiany wartosci zamiast wskakujacych rubryk program sie sypie.
Wrzucam screen z kodem i z debuggera
problem.png

0

boxlayout masz puste (0x0 == nullptr). layout też musisz utworzyć (i nie gubić do niego wskaźnika). Wstaw całość kodu (GH?), albo pomęcz się z debuggerem. Ciężko z tego screenshota mi więcej powiedzieć

0

Dobra, już widzę: utworzyłaś ten boxLayout w powietrzu (no, w głównej klasie) oraz utworzyłaś verticalLayout w designerze. Używasz złej zmiennej, zamiast boxLayout - ui->verticalLayout.

To już działa¹, ale jeszcze musisz się zastanowić co się dzieje gdy dodajesz i odejmujesz wartości ze spinboxa.

¹ nie crashuje się

0

Zmodyfikowałam kod aby przy odjęciu ilości na spinboxie liczba widgetów layoucie się zmniejszała,ale niestety nie chce sie usunąć dodatkowy lineEdit z label'em :/

void MainWindow::on_spinBox_valueChanged(int arg1)
{
    Refresh(widgetForms);
    boxLayout = ui->verticalLayout;

    for(int i=0;i<arg1;i++)
    {
        auto w = new Form(this);
        widgetForms.push_back(w);
        boxLayout->addWidget(widgetForms[i]);
    }

    averageRatings.setQuantity(arg1);
}

void MainWindow::Refresh(QVector<Form *> forms)
{
    for(int i=0; i<forms.size();i++)
    {
       boxLayout->removeWidget(forms[i]);
       delete forms[i]
    }

    forms.clear();
}

error.png
Takie coś się dzieje przy zmianie wartości w spinBoxie z 7 na 6...

@Edit
@kq jeśli dobrze myślę to problemem jest to,ze program usuwa widgety z layouta i z vectora,ale nie usuwa obiektu z pamięci i to co widać na obrazku to nieusunięte obiekty z pamięci ? Jeśli tak to gdzie w kodzie umieścić operację usuwania obiektu ? (próbowałam sama ale zawsze dochodzi do wysypu aplikacji,gdy działa).

@EDIT2
DZIAŁA!
Metoda Refresh() musi działać na referencji do QVectora

0

Coś mi się zdaje że można to napisać dużo prościej. VBoxLayout powinien mieć możliwość kasowania po indeksie, dodatkowy wektor to raczej tylko zaciemnianie kodu.

Nie jestem też pewien czy delete jest potrzebne: layout przejmuje własność dodanych do niego widgetów. A nawet jak już - deleteLater()

0

Nie wiem. Mam nawet problemy z zwykłym ustawieniem validacji

#include "form.h"
#include "ui_form.h"
#include <QDoubleValidator>

Form::Form(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Form)
{
    ui->setupUi(this);
    QDoubleValidator *validator = new QDoubleValidator(1.0,6.0,1,ui->lineEdit);
    validator->setNotation(QDoubleValidator::StandardNotation);
    ui->lineEdit->setValidator(validator);
}

Form::~Form()
{
    delete ui;
}

Wg tego powinna być możliwość wpisania tylko liczb z zakresu od 1 do 6 podczas mimo użycia tego nadal można wpisać 0 lub 99 :/
Qt miał nawet problem z innym layoutem.Ustawienie Form Layouta spowodowało,ze nawet przyciski nie były widoczne :/ i nie mozna bylo edytowac ilosci kolumn

0

Wg tego co widzę na SO, musisz albo zrobić własną subklasę QDoubleValidatora, albo podpiąć się do slotu textChanged. Osobiście jednak zrobiłbym to co rekomendowałem wcześniej i użył QRegExpValidatora.

0

QRegExpValidator działa,ale niestety mozna wprowadzać tylko liczby całkowite :/

0

\d(?:\.\d+)? - tutaj masz regexp dla liczb niecałkowitych

0

I wprowadzam to przed [1-6]* czy po ?

0

A no tak, to oceny mają być. [1-6](?:\.\d+)? - chociaż to pozwoli na 6.9999 jako ocenę.
([1-5](\.\d+)?|6) - tego użyj

Tu się pobaw: https://regex101.com/r/mtciDe/1

0

Działa! Dzięki wielkie.
Aczkolwiek nie powiem,ze przez te pytania i problimy zaczynam wątpić w swój skill programistyczny :(
Chyba,że to normalne z słabym angielskim i jak się zaczyna przerabiać jakiś framework/bibliotekę ?

1

Osobiście uważam, że jest wręcz przeciwnie i w porównaniu do innych początkujących, których mam możliwość tu i w innych miejscach spotykać - błyszczysz. Stosujesz się do rad, przychodzisz z rzeczywistymi problemami (a nie "zróbcie za mnie"), albo nawet wadliwymi, choć działającymi rozwiązaniami. No i zdajesz się nie mieć kurzej pamięci, porady sprzed kilku tematów traktujesz wciąż jako aktualne.

Angielski to konieczność, ale próg wejścia do sprawnego czytania dokumentacji nie jest aż taki wysoki imo. Prędzej czy później wyrobisz sobie znajomość podstawowych zwrotów, nawet jeśli będziesz je rozumieć wyłącznie w kontekście programowania, a nie dla całości j. ang.

Problemy z poznaniem czegoś nowego występują u każdego, a newbie mają podwójnie trudno, bo uczą się programowania oraz konkretnego języka/frameworka, więc naprawdę nie masz się czym przejmować. Przynajmniej tak długo jak widzisz postępy ;​)

Kurde, ale laurka wyszła.

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