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.
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
Podejrzewam że w systemowym Kalkulatorze jest niszczone po prostu dotychczasowe okno i tworzone nowe, inne.
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.
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.
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.
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ć?
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?
#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
@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: ");
}
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.
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"