• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

QT - stworzenie nowego lineEdita i dodanie do istniejącego grid layoutu po kliknięciu w button i moje problemy

Object Storage Arubacloud
0 głosów
211 wizyt
pytanie zadane 2 listopada 2015 w C i C++ przez Eerie Mądrala (7,130 p.)
edycja 2 listopada 2015 przez Eerie

Uczę się QT i postanowiłem napisać aplikację. Wygląda ona tak, że jest lineEdit oraz pushButton. Poniżej jest pusty grid layout. Tak to wygląda na screenie w edytorze: http://i.imgur.com/2txuXnv.png

Aplikacja ma w zamyśle działać tak: user wpisuje w lineEdita liczbę, a po kliknięciu na push button, w grid layoucie pojawia się tyle lineEditów, ile user sobie zażyczył. Wpisujesz liczbę np. 3, klikasz w button, a potem widzisz że pojawiły się 3 dodatkowe pola w których również coś możesz wpisać.

Kliknięciu w mojego pushButtona odpowiada na razie taka funkcja:

void Application::on_pushButton_clicked()
{
    int thingsCountInt = qtStringtoInt(thingsCountStr);//zamiana qt stringa z lineEdita na inta w celu przyszłęgo użycia tego inta w pentli, zmienna thingsCountStr to zmienna globalna zawierająca to samo, co jest w środku tego edita

    for(int a = 0; a < thingsCountInt; a++)//petla wykonujaca sie tyle razy ile wpisalismy w tego lineEdita
    {
        QLineEdit *myLineEdit = new QLineEdit;//tworzenie nowego obiektu klasy myLineEdit
        Application->centralWidget->gridLayout->addWidget(myLineEdit, 0, 0);//ta linijka powoduje error i opisze o tym ponizej
    }
}

Przy okazji wspomnę, że Application to nazwa klasy mojego programu.

Jedna z linijek, opisana odpowiednio przez komentarz, powoduje error. Ten error brzmi:

błąd: expected unqualified-id before '->' token
         Application->centralWidget->gridLayout->addWidget(myLineEdit, 0, 0);

Ta linijka ma dodawać utworzony w obecnej iteracji pętli obiekt do gridLayoutu. I wydaje mi się, że napisałem ją źle.

Mógłby może ktoś rzucić okiem i powiedzieć mi, jak powinienem poprawnie napisać tą linijkę, żeby dodało tego lineEdita do grida?

3 odpowiedzi

0 głosów
odpowiedź 3 listopada 2015 przez Eerie Mądrala (7,130 p.)
 
Najlepsza

Ok ludzie, poradziłem sobie. Ta linijka powodująca errora powinna brzmieć:

ui->gridLayout->addWidget(myLineEdit, 0, 0);

 

0 głosów
odpowiedź 2 listopada 2015 przez furas Maniak (53,800 p.)

Jak sam powiedziałeś `Application` to nazwa klasy - a tam potrzebny jest obiekt nie klasa.

W tym przypadku zdaje się powinno wystarczyć użycie `this`.

this->centralWidget->gridLayout->addWidget(myLineEdit, 0, 0);

komentarz 2 listopada 2015 przez Eerie Mądrala (7,130 p.)
Zmieniłem tą linię tak jak napisałeś i teraz mam dwa errory.

Error 1:

błąd: invalid use of member (did you forget the '&' ?)
         this->centralWidget->gridLayout->addWidget(myLineEdit, 0, 0);

Error 2:

błąd: base operand of '->' is not a pointer

Oba dotyczą tej właśnie linijki.
komentarz 3 listopada 2015 przez Rogargol Pasjonat (16,600 p.)
moze kompilator dobrze podpowiada Ci zeby uzyc operatora &,

druga podpowiedz znaczy, ze warto sprobowac kropki zamiast ->
komentarz 3 listopada 2015 przez Eerie Mądrala (7,130 p.)
edycja 3 listopada 2015 przez Eerie

Trochę pokombinowałem metodą prób i błędów i teraz ta problematyczna linijka wygląda tak:

this->centralWidget.gridLayout->addWidget(myLineEdit, 0, 0);

Teraz mam tylko jeden error.  '((Application*)this)->QMainWindow::centralWidget' does not have class type
         this->centralWidget.gridLayout->addWidget(myLineEdit, 0, 0);

Mógłbyś może napisać, jak twoim zdaniem powinna wyglądać ta linijka?

0 głosów
odpowiedź 3 listopada 2015 przez Bondrusiek Maniak (61,370 p.)

Witam serdecznie to mój pomysł na rozwiązanie Twojego problemu.

Oto jego treść (upchne ile się da wink):

application.h

#ifndef APPLICATION_H
#define APPLICATION_H
#include <QWidget>
#include <QLineEdit>
namespace Ui {class Application;}
class Application : public QWidget
{
    Q_OBJECT
public:
    explicit Application(QWidget *parent = 0);
    ~Application();
private:
    Ui::Application *ui;
    QLineEdit *lineEdit[11];
private slots :
    void operation() ;
};
#endif // APPLICATION_H

application.cpp

#include "application.h"
#include "ui_application.h"
Application::Application(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Application)
{
    ui->setupUi(this);
    connect(ui->pushButton,SIGNAL(clicked()),this,SLOT(operation()));
    for(int i = 0 ; i < 10 ; i++)
        lineEdit[i] = new QLineEdit ;
}
Application::~Application()
{
    delete ui;
}
void Application::operation()
{
    int count = ui->lineEdit->text().toInt();
    if(count <= 0)
        count = 0 ;
    else if(count > 9)
        count = 9 ;
    for(int i = 1 ; i < (count+1) ; ++i)
    {
        int row = ((9-i)/3)+2 ;
        int column = ((i-1)%3)+1;
        ui->gridLayout->addWidget(lineEdit[i],row,column);
    }
}

na końcu formularz *.ui

U mnie program umożliwia zwiększania lineeditów ale już zmniejszania nie. Mam nadzieję, że choć trosze pomogłem.

komentarz 4 listopada 2015 przez Eerie Mądrala (7,130 p.)
Już sobie poradziłem :)

Podobne pytania

0 głosów
0 odpowiedzi 128 wizyt
pytanie zadane 6 lipca 2019 w C i C++ przez XSPACE Użytkownik (690 p.)
0 głosów
1 odpowiedź 252 wizyt
pytanie zadane 24 czerwca 2019 w C i C++ przez amelia.cpp Obywatel (1,860 p.)
0 głosów
2 odpowiedzi 1,682 wizyt
pytanie zadane 30 kwietnia 2015 w C i C++ przez Linker Bywalec (2,690 p.)

92,570 zapytań

141,422 odpowiedzi

319,643 komentarzy

61,958 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...