QT Creator- zmiana widoku okna po wciśnięciu PushButton

0

Witam.
Chcę się dowiedzieć, czy jest możliwość zrobienia czegoś takiego jak w kalkulatorze systemowym Windows, mianowicie po wciśnięciu "Push Button" poszerzy mi się okno w którym będzie więcej opcji. Jako przykład podam wspomniany wcześniej kalkulator. Po wciśnięciu "Widok" oraz np. zaznaczenie trybu "naukowy" wyświetla się więcej opcji wyboru z lewej strony ekranu.

0

Oczywiście. Wystarczy że utworzysz odpowiedni slot i podepniesz go pod odpowiedni sygnał z instancji qPushButton.
W slocie odpowiednio zmieniasz layout, np. poprzez dodanie odpowiednich widgetów:

void QLayout::addWidget ( QWidget * w )

Więcej znajdziesz w Qt Assistant:
Home >> Examples >> Layout Examples >> Dynamic Layouts Example

0

Podejrzewam że w systemowym Kalkulatorze jest niszczone po prostu dotychczasowe okno i tworzone nowe, inne.

0

@Azarien
Chodziło mi o efekt wizualny, więc to raczej nie ma znaczenia.

@Edit:
Mógłbym prosić o podanie przykładu, jak przypisać tekst z okna QLineEdit do zmiennej która będzie traktowana jako liczba rzeczywista?

0
kielbas99 napisał(a):

@Edit:
Mógłbym prosić o podanie przykładu, jak przypisać tekst z okna QLineEdit do zmiennej która będzie traktowana jako liczba rzeczywista?

float val = ui->lineEdit->text().toFloat();

Dla double odpowiednio używasz:

toDouble()

Aby sprawdzić czy zwrócony wynik jest poprawny, przekazujesz do funkcji pointer na bool'a.

0
dampe napisał(a):

Aby sprawdzić czy zwrócony wynik jest poprawny, przekazujesz do funkcji pointer na bool'a.

Mógłbym prosić o jaśniejsze wyjaśnienie?
Mam jeszcze jedno pytanie. Załóżmy, że odczytałem tekst z dwóch widgetów QLineEdit, następnie skonwertowałem to na float, dodałem do PushButton najpierw działanie matematyczne i teraz chcę wyświetlić to w innym QLineEdit. Muszę zmienić wynik na String (jako nowa zmienna?) używając ui->lineEdit->setText(zmienna)? Jaką komendą dokonuje się konwersacji z float na string (obstawiam zmienna().ToString)? Niestety dopiero zaznajamiam się ze środowiskiem programowania wizualnego i za bardzo mi to nie wychodzi.

0
float QString::toFloat ( bool * ok = 0 ) const

Returns the string converted to a float value.
If a conversion error occurs, *ok is set to false; otherwise *ok is set to true. Returns 0.0 if the conversion fails.
Example:

     QString str1 = "1234.56";
     str1.toFloat();             // returns 1234.56

     bool ok;
     QString str2 = "R2D2";
     str2.toFloat(&ok);          // returns 0.0, sets ok to false

Konwersji dokonujesz używając statycznej funkcji:

QString::number

Zacznij korzystać z Qt Assistant - czym wcześniej tym lepiej dla Ciebie.

0

Dziękuje za pomoc. Mam parę kolejnych problemów. W każdym konstruktorze powtarzają mi się te same 4 linijki:

    float rea=ui->Rea->text().toFloat();
    float reb=ui->Reb->text().toFloat();
    float ima=ui->Ima->text().toFloat();
    float imb=ui->Imb->text().toFloat();

Próbowałem napisać metodę ale nic mi nie wychodzi. Następny problem mam z zapisywaniem wartości z QLineEdit do pliku .txt

void Kalkulator::on_actionZapisz_do_pliku_triggered()
{
    QString b=QString::number(re);
    QString c=QString::number(im);
    [...]
    QString plik=QFileDialog::getSaveFileName(this, tr("Zapisz do pliku"),"",tr("Plik tekstowy (*.txt);;Wszystkie pliki (*)"));
    if (plik.isEmpty())
        return;
    else {
        QFile file(plik);
        if (!file.open(QIODevice::WriteOnly)) {
            QMessageBox::information(this, tr("Nie można otworzyć pliku"),
                file.errorString());
            return;
        }
        QDataStream out(&file);
        out.setVersion(QDataStream::Qt_5_4);
        out << b << "Test" << c [...];
    }
} 

Wygląd programu dodaję w załączniku. Kod nie jest jeszcze ukończony. Chcę zapisać do pliku wyniki z każdego QLineEdit z opisem, aby było wiadomo o co chodzi, jednak wygląda to strasznie nieestetycznie w moim kodzie. Jakieś wskazówki, aby to poprawić?

0

Odświeżam temat. Udało mi się zrobić zmianę widoku ale za pomocą Extension Example. Mam dalej problem z zapisywaniem tekstu do pliku. Zmieniłem QDataStream na QTextStream, lecz nie wiem jak robić przejścia w wierszach. "\n" nie spełnia tutaj swojej roli. Jakieś pomysły?

0
#include <iostream>
#include <memory>
#include <vector>
#include <string>
#include <algorithm>
#include <sstream>

#include <QString>
#include <QFile>
#include <QTextStream>
#include <QDir>

int main()
{
	QFile f("abc.txt");                                                                              // nazwa pliku z rozszerzeniem, lub pełna ścieżka
	std::cout << QDir::current().absolutePath().toStdString();                       /// wypisuje current directory (folder w któym pracuje program)
	if(f.open(QIODevice::Text | QIODevice::WriteOnly | QIODevice::Append)){ // jeżeli udało się otworzyć plik.
		QTextStream t(&f);                                                                    // utwórz text stream pracujący z f (QFile)
		std::stringstream ss;                                                                 // stream, do którego ładujesz dane, które chcesz zapisać do pliku
		ss << "cze co tam";                                                                   // przykładowe dane "cze co tam";
		t << QString::fromStdString(ss.str()) << "\n";                               // zapisz dane do pliku '\n' przechodzi do następnej linii (możesz tu podać dowolny QString)
	} else {
		std::cout << "dupa";                                                                // jeżeli się nie udało dokonać zapisu to "dupa"
	}
}

np. tak

0

@gośćabc
Dziękuję. Mógłbyś mi jeszcze wyjaśnić co dzieje się w warunku if oraz else? Chcę przerobić swój kod, aby umieszczał odstępy między wierszami oraz spacje. W twoim przypadku jest to

 t << QString::fromStdString(ss.str()) << "\n";

jednak tak jak napisałem wcześniej, proszę o wyjaśnienie, ponieważ nie wiem jak przenieść to do mojego kodu.
A wygląda on tak:

 QString plik=QFileDialog::getSaveFileName(this, tr("Zapisz do pliku"),"",tr("Plik tekstowy (*.txt);;Wszystkie pliki (*)"));
    if (plik.isEmpty())
        return;
    else {
        QFile file(plik);
        if (!file.open(QIODevice::WriteOnly)) {
            QMessageBox::information(this, tr("Nie można otworzyć pliku"),
                file.errorString());
            return;
        }
        QTextStream out(&file);
        out << ("Data: "+date.toString());
        out << ("\nLiczba 1:    ");
    } 
0

Dzięki wielkie, wszystko gra. Mam jeszcze jedno pytanie. Jaki dać warunek, aby sprawdzało czy w oknie lineEdit znajduje się tekst? Jest to kalkulator i chodzi o to, aby po wpisaniu tekstu do lineEdit nie można było przeprowadzić operacji. Nie wiem, jak zapisać ten warunek. Jeszcze raz dziękuję za pomoc oraz poświęcony mi czas.

0

oddziel input line edit od tej, która wyświetli Ci wyniki, w designerze możesz ustawić łatwo, że jest read only

a jak już musisz to chyba jest tam sygnał ontextchanged() czy cuś, sprawdzasz czy coś tam jest i blokujesz

i wytłumacz co to jest "przeprowadzanie operacji"

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