• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

[Qt] Obrazek jako tło

Object Storage Arubacloud
+4 głosów
2,060 wizyt
pytanie zadane 9 kwietnia 2015 w C i C++ przez Linker Bywalec (2,690 p.)
Witam. Mam problem bowiem chciałbym zrobić aby obrazek był tłem, lecz mimo moich prób się to nie udało.

Jestem nowy w Qt. Proszę o pomoc.

4 odpowiedzi

0 głosów
odpowiedź 9 kwietnia 2015 przez Rodzyn Użytkownik (980 p.)
edycja 9 kwietnia 2015 przez Rodzyn
Podpinam się do pytania :P W końcu porzuciłem na razie Javę aby co nieco pouczyć się w C++ i Qt :P Zaopatrzyłem się w książki (C++ i Qt, Wprowadzenie do wzorców projektowych) I mam kilka fajnych pomysłów na fajne programiki ;) PS. Ktoś może polecić stronkę gdzie można też znaleźć kody z przykładami i wytłumaczeniem czemu tak a nie inaczej? :D Bo na razie nie mogę ogarnąć o co chodzi w ogóle z tym int main() (pewnie coś jak w Java public static void main (String[] args) ;) heh
komentarz 10 kwietnia 2015 przez Bondrusiek Maniak (61,410 p.)
Postaram tobie wytłumaczyć na tym prosciutkim programie 
#include <QApplication>
#include <QTextEdit>
 
int main(int argc, char **argv)
{
 QApplication app(argc, argv);
 
 QTextEdit textEdit;
 textEdit.show();
 
 return app.exec();
}

Z pomoca dyrektyw include dołącza sie KLASY QApplication oraz QTextEdit. Funkcja main to główna funkcja programu. Tutaj jest z tymi parametrami aby ułatwić jesj prace z konsolą np :

Jeśli z konsoli wywołasz przykładowo:

twoj_program -o file.txt 1094 45    //to wpiszemy do konsoli wtedy
To argc == 5, argv[0] == "twoj_program", argv[1] == "-o", argv[2] == "file.txt", argv[3] == "1094", argv[4] == "45".

agrc - argument count //  argv - argument value

QApplication app(argc,argv) tworzy nową instancje i podaje argumenty do konstruktora. Ta klasa ułatwia czytanie poleceń programu.

QTextEdit textEdit; to jest zwykła klasa. Aby wywołać jakąś metody w naszym przypadku show używamy operatora '.'

return app.exec(); to nieskończona pętla zwracająca do programu wynik działania(np przesuniecie kursora, wciśniecie jakiegoś przycisku itp).To można połączyć z angielskim : execute.

Kurs :

http://cpp0x.pl/kursy/Kurs-Qt-C++/503 

komentarz 10 kwietnia 2015 przez Rodzyn Użytkownik (980 p.)
Ok wielkie dzięki :D

A jeszcze jedno pytanie jak ładnie przejść z jednej funkcji do drugiej, słuszałem że często początkujący używają komendy goto ale podobno nie powinno się tego używać ze względu na przejrzystość kodu :P

W java np robi się przez podanie nazwy funkcji, lub klasy i funkcji ;) heh
komentarz 10 kwietnia 2015 przez Bondrusiek Maniak (61,410 p.)

Troszkę nie rozumiem Twojego pytania. Komendy goto nie powinno się stosować(w rzadkości się przydaje). Dawniej stosowano goto w funkcjach zagnieżdżonych coś takiego:

for(;;;){

   for(;;;) {

               for(;;;){

                            goto jakas_funkcja()}}}

Lepszym rozwiązaniem jest użycie komendy przerwania break; . Ta komenda przerywa pętle i wychodzi na zewnątrz.

Teraz co do wywołowania funkcji :

Jeśli to normalna funkcja(np zewnętrzna) to wywołujesz ją jak w normalnym c czy c++.

// kod programu

funkcja_co_cos_wyswietla_bez_argumentu();

int cos = funkcja_co_zwraca_int_z _argumentem(jakis_argument);

//dalszy kod

Jeśli jest to funkcja składowa w klasie to wywołujemy ją następująco

klasa operator zakresu '::' nazwa funkcji np;

QMessageBox::information(this , "Tytul","Zawartosc", QMessageBox::Ok);

Jak coś nie jasne to pytaj może pomoge.

0 głosów
odpowiedź 10 kwietnia 2015 przez Bondrusiek Maniak (61,410 p.)

Kilka sposobów :


int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    QGraphicsScene scene;
    QGraphicsView view(&scene);
    QGraphicsPixmapItem item(QPixmap("c:\\test.png"));
    scene.addItem(&item);
    view.show();
    return a.exec();
}

gdzie "c:\\test.png" to Twój obrazek. Obrazek najlepiej dodać do pliku zasobów.

drugi sposób :

QPixmap image = new QPixmap("blah.jpg");

QLabel imageLabel = new QLabel();
imageLabel.setPixmap(image);

mainLayout.addWidget(imageLabel);

To jest za pomocą klasy QLabel.

I trzeci sposób z html:

MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent)
{
    ...
    QWidget *pic = new QWidget(this);
    pic->setStyleSheet("background-image: url(test.png)");
     pic->setGeometry(QRect(50,50,128,128));

    ...

QLabel label("<img src='image.jpg' />");
    label.show();
}

Polecam 1 sposob.Jakby coś nie było jasne to pytaj.

komentarz 11 kwietnia 2015 przez Linker Bywalec (2,690 p.)

Próbowałem dwoma sposobami ale nie działasad Powiedz jakiego typu jest zmienna "mainLayout"( ja w domyśle dałem jako QLayout)

komentarz 11 kwietnia 2015 przez Bondrusiek Maniak (61,410 p.)
Szczerze powiedziawszy nie ma znaczenie może to być QHBoxLayout, QVBoxLayout czy QGridLayout(te klasy są bardziej precyzyjne niż QLayout). Żeby działać na tych klasach musisz je dołączyć do pliku używając dyrektywy #include np #include <QHBoxLayout> .

Jeszcze taka uwaga : twój obrazek dobrze dołączyć do zasobów programów wtedy łatwiej się z niem pracuje oraz ten obrazek jest dołączany do zkompilowanego programu. Jak czegoś jeszcze nie wiesz to pytaj może pomoge.
komentarz 11 kwietnia 2015 przez Linker Bywalec (2,690 p.)
I się nie wyświetla pomimo użycia np QHBoxLayout, tylko mignie jakieś jakby drugie okno.
0 głosów
odpowiedź 11 kwietnia 2015 przez Bondrusiek Maniak (61,410 p.)

Jeszcze raz teraz wytłumacze krok po kroku.

1)Wchodzisz w Qt Creatora. Klikasz Plik->Nowy plik lub projekt->Aplikacja Qt Widgets. Podpisujesz projekt, wybierasz QWidget, odznaczasz form.

2)Gdy utworzysz sobie projekt: usun Widget.cpp oraz Widget.h. Klikasz prawy przyciskie i wybierasz opcje usun plik....

Powinno zostać tylko nazwa_projektu.pro oraz main.cpp.

3)Klikasz prawym przyciskiem myszy na nazwa_projektu.pro wybierzasz opcje dodaj nowy...->Qt->plik z zasobami Qt wpisujesz nazwe pliku z zasobami. Powinno się otworzyć okno z plikami z zasobami możesz równie wejść do edytora klikając prawy, na ikonke plik.qrc wybierając Otwórz z edytorem. Nastepnie klikasz na przycisk w tym edytorze Dodaj->Dodaj przedrostek. Powinno być napisanie w pasku Przedrostek : /new/prefix1 . Następnie klikasz Dodaj->Dodaj pliki i dodajesz jakiś obrazek. Klikasz na ten obrazek w tym edytorze(pod : /new/prefix1)  i zmieniasz wpisując w rubryke Alias : obraz.

4)Wklejasz ten kod do main.cpp

#include <QApplication>
#include <QPixmap>
#include <QGraphicsScene>
#include <QGraphicsView>
#include <QGraphicsPixmapItem>


int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    QGraphicsScene scene;
    QGraphicsView view(&scene);
    QPixmap nap(":/new/prefix1/obraz");
    QGraphicsPixmapItem item(nap);
    scene.addItem(&item);
    view.show();
    return a.exec();
}

Kompilujesz program (Ctrl+R) lub klikasz na zieloną strzałke i gotowe. Myśle, że wytłumaczyłem jak coś niejasne to napisz.

komentarz 12 kwietnia 2015 przez Linker Bywalec (2,690 p.)
Da się zrobić w mainwindow? Bo chciałbym aby na tym były przyciski itp.
0 głosów
odpowiedź 11 kwietnia 2015 przez Linker Bywalec (2,690 p.)
Ok. działa ale w nowym oknie, ajak zrobić żeby obrazek był tłem okna "MainWindow" a na nim przyciski itp.Bo tanten kod nie działa w Klasie MainWindow. Proszę o pomoc i wytłumaczenie dlaczego tak się dzieje.
komentarz 12 kwietnia 2015 przez Bondrusiek Maniak (61,410 p.)

Spróbuj użyć trybu graficznego i dodaj do QMainWindow QWidget/QLabel. Odwołaj sie w konstruktorze do tej zmiennej i napisz ui->pic->setStyleSheet("background-image: url(test.png)"); gdzie pic jest nazwą widżetu test.png nazwa obrazka.

komentarz 12 kwietnia 2015 przez Linker Bywalec (2,690 p.)
edycja 12 kwietnia 2015 przez Linker
Robię to bez QDesignera. Próbowałem z QWidget i wyświetla się tylko mała część obrazka w górnym lewym rogu. Co robić? Dlaczego tak się dzieje?
komentarz 13 kwietnia 2015 przez Bondrusiek Maniak (61,410 p.)

Ja myślę, że powinieneś użyć klasy: QSplitter, która umożliwia dowolne edytowanie widżetu(dostosowanie wielkości widzetu do splitera). Więc powinno być taka kolejność:

QWidget->QSplitter->QLabel->Obraz ;

 

komentarz 13 kwietnia 2015 przez Linker Bywalec (2,690 p.)
Po dodaniu splitera wogóle nie widać obrazka.
komentarz 13 kwietnia 2015 przez Bondrusiek Maniak (61,410 p.)
Spróbój dodac, do metody :

QSpliter->setGeometry(int , int , int , int);

QWidget->setCentralWidget(QSplitter);
komentarz 13 kwietnia 2015 przez Linker Bywalec (2,690 p.)
kompilator nie widzi wogóle funkcji setCentralWidget.

Podobne pytania

0 głosów
1 odpowiedź 751 wizyt
0 głosów
1 odpowiedź 1,541 wizyt
pytanie zadane 29 maja 2016 w HTML i CSS przez tetriss Obywatel (1,710 p.)
0 głosów
4 odpowiedzi 620 wizyt
pytanie zadane 14 lutego 2016 w HTML i CSS przez tetriss Obywatel (1,710 p.)

92,624 zapytań

141,482 odpowiedzi

319,822 komentarzy

62,005 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...