visual c++ i duży projekt, jakie IDE?

0

Witam!

Tym razem piszę do was aby się poradzić. Mam do zrobienia duzy projekt i narzucony język programowania, a w związku z tym mam kilka pytań i wątpliwości. Do tej pory miałem do czynienia tylko z konsolowym C++ a projekt ma być zrobiony w Visual C++, z którym nigdy do czynienia nie miałem (i nie wchodzi tutej niestety w grę zbudowanie DLLki w C++ a całego programu np. w Javie/C#). Cała aplikacja ma zostac zbudowana w Visual C++ i oparta o sieci neuronowe i algorytmy genetyczne - ogólne program który mam do zrobienia musi dość dobrze rzopoznawac obrazy i/lub je skalować itp itd Co do całej teorii sieci neuronowych czy algorytmów genetycznych nie powinienem mieć wiekszych problemów, bo tego typu algorytmy implementowałem jakiś czas temu w języku C#, ale mimo wszystko pozostaje kilka kwestii, na które może wy znacie odpowiedzi :) Mianowicie, od czego zacząć wdrażanie się w okienkowy C++, jakich bibliotek użyć(do tej pory przy rozpoznawaniu obrazów korzystałem z OpenCV), czy są jakieś tutoriale, materiały, bądź popularne fora odnośnie tematyki visual c++ jak i rozpoznawania obrazów, czy do tworzenia dej aplikacji używać VisualStudio czy może coś prostszego i generalnie wszystkie kwestie z tym związane, z którymi ktoś z was się może kiedyś spotkał bądź zna dobre i sprawdzone praktyki/rozwiązania itp itd.

Zdecydowałem sie tutaj o tym napisać bo kiedy uruchomiłem VS 2012 chcąc rozpocząć przygodę z Visual C++ trochę się przeraziłem (jak początkujący student na pierwszej lekcji programowania) i nie mogę się w dalszym ciągu w tym odnaleźć (mając do tej pory doświadczenie w tworzeniu aplikacji okienkowych jedynie w C# lub Javie). Przekopałem również chyba wszystkie stronki, które mi znalazł wujek Google, ale jakoś nic konkretnego i specjalnie nadającego się do analizowania/uczenia nie udało mi się do tej pory znaleźć.

Będę wdzięczny za każdą poradę lub uwagę bardziej doświadczonych kolegów forumowiczów :)

0

Jeśli masz tylko narzucony kompilator, to spróbuj Qt z MSVC użyć, bardzo wygodnie się okienka tworzy.

0

Ogólnie lib-ów dotyczących okienek do wyboru masz (MFC, Qt, GTK oraz GTKmm, VCL, Tk, wxWidgets, Ultimate++) można rzec do koloru.
A jeżeli używałeś OpenCV noto używaj dalej, Visual c++ to dalej c++ a OCV ma jego wsparcie ;p

Przeraziłeś się dlatego bo korzystasz z VS++ 2012 a w nim nie ma już supportu do "Windows Forms Application"(jest ale domyślnie kreatora nowgo projektu nie ma) tam się korzysta po prostu z WinApi które na pierwszy rzut oka wydaje się dosyć treściwe.
Jeżeli masz narzucony tylko kompilator noto nie ma problemu to co kolega wyżej napisał.
Możesz też spróbować zrozumieć WinApi i z niego korzystać aczkolwiek będzie to trochę trudniejsze niż w przypadku Qt czy też MFC ale korzystając z WinApi zyskujesz szybkość i rozmiar pliku.

Możesz też ściągnąć VS++ 2010 i tam jest są te "Windows Forms Applications" lub poszukać pluginu do VS++ 2012.

Ogólnie jeżeli masz więcej czasu noto ja bym preferował WinApi, jak masz masz napięty termin to pozostaje któraś z na samym początku wymienionych ułatwiających bibliotek (i tutaj myśl o tych dwóch pierwszych).

1

Przeraziłeś się dlatego bo korzystasz z VS++ 2012 a w nim nie ma już supportu do "Windows Forms Application"

Support jest, wszystko działa nie ma tylko kreatora nowego projektu, tak żeby nie zachęcać ;-)

– utworzyć projekt konsolowy C++ (CLR Console Application)
– w opcjach projektu zmienić C/C++|Linker|System,Subsystem na Windows
– zmienić C/C++|Linker|Advanced,Entry Point na main
– dodać do projektu formę (Add|New item|Ui,Windows Form)
– zmienić główny plik .cpp (z funkcją main) na mniej-więcej taki:

#include "stdafx.h"
#include "MyForm.h"
 
using namespace WindowsFormsApplication1;

[STAThread]
int main(array<System::String^> ^args)
{
        Application::EnableVisualStyles();
        Application::SetCompatibleTextRenderingDefault(false); 
        Application::Run(gcnew MyForm());
}

(poprawić namespace'a i nazwę formy na odpowiednie).
Działa w 2012 i 2013 Preview.

Jak komuś się chce, to za pomocą Visual Studio SDK można odtworzyć wzorzec projektu wg. powyższego schematu, i stworzyć instalowalną paczkę-plugin, która przywróci ikonkę do okna New Project.
To nie jest takie trudne :)

0

Wielkie dzięki za wszystkie posty. Troche mi się cała sytuacja już rozjaśniła. Póki co zdecydowałem się na Qt i zabieram się do realizacji projektu. Gdybym miał dalsze wątpliwości lub pytania to dam znać (choć takowych już nie przewiduje)

Dzięki jeszcze raz :)

0

A jednak, zaprzyjaźniłem sie juz troche z Qt ale kilku rzeczy dalej nie rozumiem mimo szczerych chęci i czasu poświęconego na zgłębianie podobnych wątków w internecie, a mianowicie:

Po pierwsze, jak wywołać nową formatke z przycisku np. na formatce głównej, bo mając kod który teoretycznie powinien działać (gdyż wszystkie ksiażki i poradniki się tak o tym rozpisują) u mnie jednak ni jak nie zadziałał:

void MainWindow::on_actionO_programie_triggered()
{
    AboutWindow ^oProgramie = new AboutWindow();
    oProgramie->show();
}

Kompilator zgłasza bląd opcji wiersza polecenia, cokolwiek to znaczy :/ - przypominam że to aplikacja desktopowa a nie konsolowa.

Po drugie, bardziej teoretyczne pytanie co do ładowania i wyświetlania obrazków. Na formatce mam przycisk Przeglądaj, który powinien działać jak klasyczny tego typu przycisk, czyli po jego wciśnięciu ma się pokazac okno wyboru pliku graficznego, który nastepnie ma się wyświetlic w innej kontrolce ale o tym za chwile. czy do tego celu uzyć zwykłej kontrolki Button z Qt czy jest może funkcjonuje jakas inna kontrolka, która np. we właściwościach ma opcje wyświetlania okna przeglądania plików i ustawiania filtrów rozszerzeń, bo nie udało mi sie takowych opcji znaleźć przy zwykłym Buttonie

No i po trzecie - ostatnie - czy kontrolka/widget GraphicView to odpowiednik kontrolki np. ImageBox z C# bądź Javy i czego (jakiej innej kontrolki) ewentualnie użyć do wyświetlenia załadowanego wcześniej obrazu przyciskiem Przeglądaj oraz jak to zrobić aby załadowany obrazek mógł byc zapisany do jednej zmiennej binarnej, tak aby potem piksel po pikselu można by było modyfikować automatycznie taki obraz z poziomu kodu źródłowego? O to ostatnie pytam, gdyż nie wiem czy jest ta kwestia rozwiązana tak prosto jak np. w Javie czy może trzeba specjalnej wiedzy i doświadczenia aby to wykonać bo miałem już do czynienia z różnymi rozwiązaniami jesli chodzi o prace na żywych pikselach, które cząsto były okupione dużą stratą czasu, którego teraz nie mam za wiele.

0

Co do pytania pierwszego, trochę ciężko na nie odpowiedzieć mając tylko ten kawałek kodu. Napisz jaka wersja QT, czy połączyłeś go Add-Onem z Visual Studio (z poprzednich wypowiedzi wynika że w tym IDE pracujesz) oraz wklej cały kod programu.

Co do pozostałych pytań, dokładny opis, przykłady uzycia i funkcjonalność można znaleźć w dokumentacji: http://harmattan-dev.nokia.com/docs/library/html/qt4/

0
    AboutWindow ^oProgramie = new AboutWindow();

Jeśli to ma być Qt, to na pewno nie ma tam żadnych daszków...

Nie wiem czy to jest regułą czy nie ale w moim Qt komenda tworzenia nowego obiektu gcnew wywala masę błędów
Jakie gcnew? w Qt nie ma żadnych gcnew. Mieszasz języki.

0

Może najpierw odpowiedz na pytanie czy ta aplikacja ma być aplikacją działającą pod .net czy natywną? W poprzednich odpowiedziach można się zgubić w gąszczu propozycji :)
W związku z błędem z gcnew przypuszczam, że to jednak ma być aplikacja natywna, a nie .net. Wtedy Windows Forms Applications odpada, bo to projekt .net.
Jeśli wziąleś się za Qt, to raczej powinieneś wziąć jako szablon w VS (bazuję na VS2012 Express) projekt z gałęzi Templates->Visual C++->Win32, a nie Templates->Visual C++->CLR.

Co do pomysłów z użyciem WinAPI - raczej nie brałbym takiej propozycji pod uwagę. Przypuszczam, że głównym celem twojego projektu jest implementacja sieci neuronowych i algorytmów genetycznych do analizy obrazów. Natomiast celem nie jest dogłębne poznanie WinAPI czy budowania GUI pod Windows. Dlatego od strony GUI praca powinna być jak najbardziej komfortowa, szybka i bezbolesna, a dana biblioteka powinna przykrywać wszystkie detale związane z WinAPI, aby spełnić powyższe wymagania. W związku z powyższym praca z winAPI jest jak wiercenie dziury w betonie przy pomocy agrafki -pewnie się da, ale nie o to chyba chodzi.

Jeśli jednak twoja aplikacja ma być aplikacją .net, to przerzuciłbym się na C# i z użyciem np. WPF zbudował sobie GUI (przez wyklikanie go w edytorze lub bezpośrednio w xamlu - jak kto woli, zresztą jedno drugiego nie wyklucza).

0

Posiadam wersje Qt Creator 2.7 opartą na oprogramowaniu Qt w wersji 5.0.2 (wersja 32-bitowa). Do instalcji tego IDE wymagane było Visual Studio, które już wcześniej miałem zainstalowane w wersji 2012, i mogę domniemywac że te dwa środowiska zostały juz połączone w jakiś spwosób.

Problem w tym, że zarówno implementacje algorytmów genetycznych i sieci neuronowych jak i całe gui do przetwarzania/porównywania obrazów mam narzucone, że musi byc wykonane przy uzyciu visual C++, czyli .net i c# w tym wypadku odpadają tak jak wspomniałem na samym początku. Zdecydowałem sie tu do was napisac o tym, tylko dlatego że nie znam kompletnie visual c++ (jedynie podstawowy, konsolowy c++), a po wielokrotnych próbach zrobienia czegokolwiek w vc++ za pomocą Visual Studio - nie przynosiło to żadnych efektów i kończyło się sromotną porażką. Byćmoże taki stan rzeczy miał miejsce z tego względu że w VS2012 - jak ktoś tutaj słusznie zauważył - nie ma wsparcia dla WinAPI przez co cały wygląd trzeba pisac ręcznie a ja nie mam na to zbytnio czasu (chodzi o prosty interfejs, który z powodzeniem może byc wyklikany).

Co do wklejonego wcześniej kodu. Opisywane rozwiązanie znalazłem gdzieś na necie i to w kilku miejscach, z tym że co do ^ to nie miałem pewności czy to chodziło o aplikacje konsolową czy desktopową. Probówałem kilku różnych wersji tworzenia obiektu i go wyświetlania znanych mi z innych języków obiektowych, jednak do tej pory nie znalazłem rozwiązania tego problemu. Poniżej zamiszczam cały kod formatki głównej z Qt:

#include "mainwindow.h"
#include "aboutwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::on_actionO_programie_triggered()
{
    AboutWindow oProgramie;
    oProgramie.show();
}

void MainWindow::on_actionZakoncz_triggered()
{
    this->close();
}

Może ktoś z was wie jak to inaczej napisac aby uzyskać pożądany efekt?

Gdyby była taka możliwość, i znalazła by sie osoba, która chce się z poruszanymi zagadnieniami pobawić to mogę przesłać nawet cały projekt :D, ale to oczywiście jest już ostateczność :)

0

testnij

void MainWindow::on_actionO_programie_triggered()
{
    AboutWindow *oProgramie = new AboutWindow(this);
    oProgramie->show();
}

z tego co wyczytalem wtym temacie bedziesz mial ciezko bo te twoje "podstawy c++ " niesa pelne

0

Hmm... podstawy c++ znam ze względu na kilka dobrych lat studiów i kodzenia konsolowego. Byćmoże brakuje mi tylko praktyki i ogłady w tworzeniu swojego własnego kodu - nie popartego przykładami akademickimi.

Kod napisany przez Ciebie adif niestety nie działa i wywala następujący błąd:
mainwindow.obj:-1: błąd:LNK2019: unresolved external symbol "public: __cdecl AboutWindow::AboutWindow(class QWidget *)" (??0AboutWindow@@QEAA@PEAVQWidget@@@Z) referenced in function "private: void __cdecl MainWindow::on_actionO_programie_triggered(void)" (?on_actionO_programie_triggered@MainWindow@@AEAAXXZ)

Takie rozwiązanie (wywołanie okna z utworzonego wskaźnika do obiektu) testowałem już zanim o tym tutaj napisałem :/

0
  1. Nie ma konstruktora przyjmujacego pointer do QWidget
  2. Klasa AboutWindow jest zle zrobiona
  3. Nie znasz podstaw.
0

Konstruktor przyjmujący wskaźnik do Qwidgeta:

AboutWindow::AboutWindow(QWidget *parent) :
    QDialog(parent),
    ui(new Ui::AboutWindow)
{
    ui->setupUi(this);
}

Wszystko pozostałe w tej klasie jest wygenerowane przez Qt tak że wątpie aby było cos źle. W końcu po to sa IDE aby programiste uwolnic od pisania mozolnego kodu związanego z wyglądem.

Gdyby takiego konstruktora nie było w tej klasie, albo klasa była by źle zrobiona to nie prosiłbym Was o pomoc przy zaprogramowaniu wywołania tego okna z formatki głównej.

0

Po wejściu w ustawienia projektu okazało sie że nie było podanej ścieżki do qmake.exe :/ Po odnalezieniu i wstawieniu ścieżki do tego pliku okienka się wyświetlają i konstruktory poszczególnych klas działają prawidłowo. Dzieki za ukierunkowanie mnie jako człowieka, któremu się wydaje że coś umie...

Teraz pozostaje kwestia ładowania obrazków, wyświetlania ich i ich obróbki wynikowej. Gdyby ktoś z Was miał jakieś pomysły, lub wie jak dokonać załadowania obrazka do zmiennej binarnej i poprawnego wyświetlania go w jakiejś kontrolce to chętnie skorzystam, tymczasem zabieram się za przeszukiwanie dokumentacji odnośnie wszystkich kwestii "obrazkowych" w Qt

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