visual c++ i praca nad obrazami

0

Witam!

Używam środowiska Qt i musze załadować i wyświetlić obrazek (np. z dysku) na odpowiedniej kontrolce/widgecie za pomocą przycisku np. Przeglądaj a poza tym sam obrazek zapisać piksel po pikselu do jakiejkolwiek zmiennej binarnej. Zagłębiam się w sposoby użycia GraphicView, ale z tego co udało mi się wyczytać nie jest to dobry pomysł jeśli chodzi o późniejsze przetwarzanie załadowanego obrazu, tyle że kontrolka, o której jest też mowa w kontekście przetwarzania pikseli - QPainter nie jest dostępna w mojej wersji Qt. Czy moze powinienem doinstalować jakąś biblioteke, czy może samą kontrolke i co zrobić aby zdarzenie klikniącia na odpowiedni przycisk wywołało okienko wyboru pliku (po wcześniejszych doświadczeniach z VisualStudio czy Eclipse, nawet to jest utrudnieniem swego rodzaju bo jest tylko QButton, który nie jest wstępnie zdefiniowany) i w końcu wyświetliło porządany obrazek na formatce?

Jestem kompletnym nowicjuszem jeśli chodzi o środowisko Qt dlatego będę wdzięczny za każdą udzieloną pomoc.

0

Podążając za dokumentacją Qt i własnym doświadczeniem z innych języków napisałem coś takiego:

QString nazwaZdjecia1 = QFileDialog::getOpenFileName(this, tr("Otwórz plik"), "C:/", tr("Obrazy (*.jpg *.png *.bmp)"));
    QFile inputFile(nazwaZdjecia1);
    lineEditZdjecie1->setText(nazwaZdjecia1);

jako akcje dla przycisku, jednak nie wiedzieć czemu ostatnia linijka wywala błąd typu: brak deklaracji zmiennej. Zmienna lineEditZdjecie1 w tym kodzie to widget na formatce, który przeciągnąłem na formatke i docelowo ma wskazywać ścieżkę i nazwę pliku załadowanego przyciskiem. Według mnie w momencie przeciągnięcia jakiegokolwiek widgeetu na formatke powinien on być automatycznie zadeklarowany w kodzie (tak jak to jest np. w VisualStudio), a tu wygląda jak by trzeba było go deklarować mimo że fizycznie taka kontrolka już istnieje. Z resztą w podczas prób deklaracji zmiennej o tej samej nazwie typu QLineEdit, kompilator wywala błąd, że nie można przeładowywać tego typu, czyli w zasadzie zachowuje sie logicznie.

Samo okienko wyboru plików otwiera się prawidłowo tak że pierwsze dwie linijki są mam nadzieje dobrze napisane.

Tutaj jednak pobieram samą nazwę/ścieżkę do pliku, a ja potrzebuje załadować plik do jakiejś zmiennej binarnej (aby potem przetwarzać go piksel po pikselu) i wyświetlić w widgecie GraphView, który mam na formatce. Co powinienem dalej zrobić? Stworzyć obiekt, który będzie przechowywał binarnie plik, tylko skąd wziąć jego zawartość, którą nalezy przypisać do stworzonego obiektu i jak taki obiekt wyświetlić w kontrolce GraphView?

Może te pytania są dla niektórych banalne, ale ja nigdy wcześniej nie miałem styczności z Qt a teraz musze w nim zrobić aplikacje. Mimo doświadczenia z Eclipse i VisualStudio robi się tu całkowicie inaczej, inne są tez nazwy kontrolek, do których w końcu mozna dojść ale nie jest to tak intuicyjne jak w w/w środowiskach a i koncepcja slotów i sygnałów jest/była mi całkiem obca jeszcze jakiś czas temu a teraz już troche zaczynam to ogarniać.

0

Po cięzkich bojach i w konsekwecji dojściem do wniosku że zabranie się za skomplikowaną aplikacje w nowym środowisku bez znajomości podstaw było błędem, doszedłem już do tego jak z poziomu kodu zmieniac właściwości widgetów, jednak teraz mam inny problem i ogromnie liczę na waszą pomoc.

QString nazwaZdjecia1 = QFileDialog::getOpenFileName(this, tr("Otwórz plik"), "C:/", tr("Obrazy (*.jpg *.png *.bmp)"));
    QFile ladowanyPlik(nazwaZdjecia1);
    QString sciezka = ladowanyPlik.fileName();
    ui->lineEditZdjecie1->setText(nazwaZdjecia1);
    if(!sciezka.isEmpty()){
        QImage obraz(sciezka);
        if(obraz.isNull()){
            QMessageBox::information(this,"UWAGA","Wystąpił błąd podczas wyświetlania obrazu! Spróbuj ponownie.");
            return;
        }
        QGraphicsScene scena;
        QGraphicsPixmapItem item(QPixmap::fromImage(obraz));
        scena.addItem(&item);
        ui->graphicsViewZdjecie1->setScene(&scena);
        ui->graphicsViewZdjecie1->show();
    }
    QByteArray zawartoscPliku(ladowanyPlik.readAll());

Jest to mój cały, dotychczasowy kod umieszczony pod przyciskiem na formatce, który ma wykonywac kilka czynności. Mianowicie, wyświetlać ścieżkę do załadowanego pliku w widgecie lineEdit (pierdoła - wiem - ale to działa już prawidłowo :] ) w drugiej kolejności ładowany obraz ma się wyświetlić w widgecie GraphicView (i tu się zaczynają problemy z obiektem "item") i cały obraz załadować do tablicy bajtów aby potem można było piksel po pikselu ją modyfikować (stworzyłem do tego celu obiekt "zawartośćPliku") ale nie wiem czy to wystarczy aby pracować na pikselach i ich kolorach.

Jeśli chodzi o obiekt "item" to kompilator zgłasza, że:

"item" uľywa niezdefiniowanego class "QGraphicsPixmapItem"

mimo że biblioteka Pixmapy jest dołączona na początku pliku, oraz w drugiej kolejności zgłasza że nie może konwertować do tego typu z int'a co jest dla mnie całkowicie niezrozumiałe, gdyż nie operuje tutaj żadnym int'em (chyba, że ułomnosc ludzka nie zna granic i o tym nie wiem)

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