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

Odpowiedz Nowy wątek
2015-01-24 16:02
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.

Pozostało 580 znaków

2015-01-24 17:57
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


int main( int, char** ) try { throw std::logic_error( myCode() ); }
catch( const std::exception& e ) { puts( e.what() ); } ///:~

Pozostało 580 znaków

2015-01-24 18:16
0

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

Pozostało 580 znaków

2015-01-24 19:28
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?

edytowany 1x, ostatnio: kielbas99, 2015-01-24 20:27

Pozostało 580 znaków

2015-01-24 20:59
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.


int main( int, char** ) try { throw std::logic_error( myCode() ); }
catch( const std::exception& e ) { puts( e.what() ); } ///:~

Pozostało 580 znaków

2015-01-24 21:36
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.

edytowany 2x, ostatnio: kielbas99, 2015-01-24 21:55

Pozostało 580 znaków

2015-01-24 22:04
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.


int main( int, char** ) try { throw std::logic_error( myCode() ); }
catch( const std::exception& e ) { puts( e.what() ); } ///:~

Pozostało 580 znaków

2015-01-25 01:47
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ć?

edytowany 2x, ostatnio: kielbas99, 2015-01-25 20:26

Pozostało 580 znaków

2015-01-26 01:43
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?

Pozostało 580 znaków

2015-01-26 02:05
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

edytowany 6x, ostatnio: gośćabc, 2015-01-26 16:31

Pozostało 580 znaków

2015-01-26 16:13
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:    ");
    } 
dodałem komentarz - gośćabc 2015-01-26 16:28

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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