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.
- Rejestracja:około 10 lat
- Ostatnio:około 8 lat
- Postów:17

- Rejestracja:ponad 12 lat
- Ostatnio:4 miesiące
- Lokalizacja:SK
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
- Rejestracja:około 10 lat
- Ostatnio:około 8 lat
- Postów:17

- Rejestracja:ponad 12 lat
- Ostatnio:4 miesiące
- Lokalizacja:SK
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.
- Rejestracja:około 10 lat
- Ostatnio:około 8 lat
- Postów:17
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.

- Rejestracja:ponad 12 lat
- Ostatnio:4 miesiące
- Lokalizacja:SK
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.
- Rejestracja:około 10 lat
- Ostatnio:około 8 lat
- Postów:17
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ć?
- Bez tytułu.jpg (48 KB) - ściągnięć: 229
- Rejestracja:około 10 lat
- Ostatnio:około 8 lat
- Postów:17
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?

- Rejestracja:prawie 11 lat
- Ostatnio:ponad 3 lata
- Lokalizacja:Szczecin
- Postów:500
#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
- Rejestracja:około 10 lat
- Ostatnio:około 8 lat
- Postów:17
@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: ");
}

- Rejestracja:około 10 lat
- Ostatnio:około 8 lat
- Postów:17
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.

- Rejestracja:prawie 11 lat
- Ostatnio:ponad 3 lata
- Lokalizacja:Szczecin
- Postów:500
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"