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

QT Creator- zmiana widoku okna po wciśnięciu PushButton
K9
  • Rejestracja:około 10 lat
  • Ostatnio:około 8 lat
  • Postów:17
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.

dampe
  • Rejestracja:ponad 12 lat
  • Ostatnio:4 miesiące
  • Lokalizacja:SK
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:

Kopiuj
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() ); } ///:~
Azarien
  • Rejestracja:ponad 21 lat
  • Ostatnio:około 3 godziny
0

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

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

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

Dla double odpowiednio używasz:

Kopiuj
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() ); } ///:~
K9
  • Rejestracja:około 10 lat
  • Ostatnio:około 8 lat
  • Postów:17
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
dampe
  • Rejestracja:ponad 12 lat
  • Ostatnio:4 miesiące
  • Lokalizacja:SK
0
Kopiuj
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:

Kopiuj
     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:

Kopiuj
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() ); } ///:~
K9
  • Rejestracja:około 10 lat
  • Ostatnio:około 8 lat
  • Postów:17
0

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

Kopiuj
    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

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

gośćabc
  • Rejestracja:prawie 11 lat
  • Ostatnio:ponad 3 lata
  • Lokalizacja:Szczecin
  • Postów:500
0
Kopiuj
#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
K9
  • Rejestracja:około 10 lat
  • Ostatnio:około 8 lat
  • Postów:17
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

Kopiuj
 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:

Kopiuj
 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:    ");
    } 
gośćabc
dodałem komentarz
K9
  • Rejestracja:około 10 lat
  • Ostatnio:około 8 lat
  • Postów:17
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.

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

edytowany 2x, ostatnio: gośćabc
Kliknij, aby dodać treść...

Pomoc 1.18.8

Typografia

Edytor obsługuje składnie Markdown, w której pojedynczy akcent *kursywa* oraz _kursywa_ to pochylenie. Z kolei podwójny akcent **pogrubienie** oraz __pogrubienie__ to pogrubienie. Dodanie znaczników ~~strike~~ to przekreślenie.

Możesz dodać formatowanie komendami , , oraz .

Ponieważ dekoracja podkreślenia jest przeznaczona na linki, markdown nie zawiera specjalnej składni dla podkreślenia. Dlatego by dodać podkreślenie, użyj <u>underline</u>.

Komendy formatujące reagują na skróty klawiszowe: Ctrl+B, Ctrl+I, Ctrl+U oraz Ctrl+S.

Linki

By dodać link w edytorze użyj komendy lub użyj składni [title](link). URL umieszczony w linku lub nawet URL umieszczony bezpośrednio w tekście będzie aktywny i klikalny.

Jeżeli chcesz, możesz samodzielnie dodać link: <a href="link">title</a>.

Wewnętrzne odnośniki

Możesz umieścić odnośnik do wewnętrznej podstrony, używając następującej składni: [[Delphi/Kompendium]] lub [[Delphi/Kompendium|kliknij, aby przejść do kompendium]]. Odnośniki mogą prowadzić do Forum 4programmers.net lub np. do Kompendium.

Wspomnienia użytkowników

By wspomnieć użytkownika forum, wpisz w formularzu znak @. Zobaczysz okienko samouzupełniające nazwy użytkowników. Samouzupełnienie dobierze odpowiedni format wspomnienia, zależnie od tego czy w nazwie użytkownika znajduje się spacja.

Znaczniki HTML

Dozwolone jest używanie niektórych znaczników HTML: <a>, <b>, <i>, <kbd>, <del>, <strong>, <dfn>, <pre>, <blockquote>, <hr/>, <sub>, <sup> oraz <img/>.

Skróty klawiszowe

Dodaj kombinację klawiszy komendą notacji klawiszy lub skrótem klawiszowym Alt+K.

Reprezentuj kombinacje klawiszowe używając taga <kbd>. Oddziel od siebie klawisze znakiem plus, np <kbd>Alt+Tab</kbd>.

Indeks górny oraz dolny

Przykład: wpisując H<sub>2</sub>O i m<sup>2</sup> otrzymasz: H2O i m2.

Składnia Tex

By precyzyjnie wyrazić działanie matematyczne, użyj składni Tex.

<tex>arcctg(x) = argtan(\frac{1}{x}) = arcsin(\frac{1}{\sqrt{1+x^2}})</tex>

Kod źródłowy

Krótkie fragmenty kodu

Wszelkie jednolinijkowe instrukcje języka programowania powinny być zawarte pomiędzy obróconymi apostrofami: `kod instrukcji` lub ``console.log(`string`);``.

Kod wielolinijkowy

Dodaj fragment kodu komendą . Fragmenty kodu zajmujące całą lub więcej linijek powinny być umieszczone w wielolinijkowym fragmencie kodu. Znaczniki ``` lub ~~~ umożliwiają kolorowanie różnych języków programowania. Możemy nadać nazwę języka programowania używając auto-uzupełnienia, kod został pokolorowany używając konkretnych ustawień kolorowania składni:

```javascript
document.write('Hello World');
```

Możesz zaznaczyć również już wklejony kod w edytorze, i użyć komendy  by zamienić go w kod. Użyj kombinacji Ctrl+`, by dodać fragment kodu bez oznaczników języka.

Tabelki

Dodaj przykładową tabelkę używając komendy . Przykładowa tabelka składa się z dwóch kolumn, nagłówka i jednego wiersza.

Wygeneruj tabelkę na podstawie szablonu. Oddziel komórki separatorem ; lub |, a następnie zaznacz szablonu.

nazwisko;dziedzina;odkrycie
Pitagoras;mathematics;Pythagorean Theorem
Albert Einstein;physics;General Relativity
Marie Curie, Pierre Curie;chemistry;Radium, Polonium

Użyj komendy by zamienić zaznaczony szablon na tabelkę Markdown.

Lista uporządkowana i nieuporządkowana

Możliwe jest tworzenie listy numerowanych oraz wypunktowanych. Wystarczy, że pierwszym znakiem linii będzie * lub - dla listy nieuporządkowanej oraz 1. dla listy uporządkowanej.

Użyj komendy by dodać listę uporządkowaną.

1. Lista numerowana
2. Lista numerowana

Użyj komendy by dodać listę nieuporządkowaną.

* Lista wypunktowana
* Lista wypunktowana
** Lista wypunktowana (drugi poziom)

Składnia Markdown

Edytor obsługuje składnię Markdown, która składa się ze znaków specjalnych. Dostępne komendy, jak formatowanie , dodanie tabelki lub fragmentu kodu są w pewnym sensie świadome otaczającej jej składni, i postarają się unikać uszkodzenia jej.

Dla przykładu, używając tylko dostępnych komend, nie możemy dodać formatowania pogrubienia do kodu wielolinijkowego, albo dodać listy do tabelki - mogłoby to doprowadzić do uszkodzenia składni.

W pewnych odosobnionych przypadkach brak nowej linii przed elementami markdown również mógłby uszkodzić składnie, dlatego edytor dodaje brakujące nowe linie. Dla przykładu, dodanie formatowania pochylenia zaraz po tabelce, mogłoby zostać błędne zinterpretowane, więc edytor doda oddzielającą nową linię pomiędzy tabelką, a pochyleniem.

Skróty klawiszowe

Skróty formatujące, kiedy w edytorze znajduje się pojedynczy kursor, wstawiają sformatowany tekst przykładowy. Jeśli w edytorze znajduje się zaznaczenie (słowo, linijka, paragraf), wtedy zaznaczenie zostaje sformatowane.

  • Ctrl+B - dodaj pogrubienie lub pogrub zaznaczenie
  • Ctrl+I - dodaj pochylenie lub pochyl zaznaczenie
  • Ctrl+U - dodaj podkreślenie lub podkreśl zaznaczenie
  • Ctrl+S - dodaj przekreślenie lub przekreśl zaznaczenie

Notacja Klawiszy

  • Alt+K - dodaj notację klawiszy

Fragment kodu bez oznacznika

  • Alt+C - dodaj pusty fragment kodu

Skróty operujące na kodzie i linijkach:

  • Alt+L - zaznaczenie całej linii
  • Alt+, Alt+ - przeniesienie linijki w której znajduje się kursor w górę/dół.
  • Tab/⌘+] - dodaj wcięcie (wcięcie w prawo)
  • Shit+Tab/⌘+[ - usunięcie wcięcia (wycięcie w lewo)

Dodawanie postów:

  • Ctrl+Enter - dodaj post
  • ⌘+Enter - dodaj post (MacOS)