2014-12-18 14 views
9

İlk Qt/QML uygulamanızı geliştiriyoruz (teknolojiyi denemek). Teknoloji bir bakışta çok ümit verici görünmekle birlikte, neredeyse en baştan pes edecek pek çok beklenmedik garip sorunla karşılaştık.QML: uygulama klasörüne göre görüntü dosyası yolunun nasıl belirtileceği

İşte böyle bir sorun.

Biz şu klasörler uygulamamız için düzeni istiyorum:

--> ApplicationFolder 
|--> qml  // QML files (also structured by subfolders) 
|--> resources // Application resources (images, sounds, data-files, etc.) 
| |--> images // Image resources (also structured by subfolders) 
| |--> data  // Different data files 
| |--> ...  // Other resources 
|--> Application.exe // Application executable 
|--> *.dll    // DLLs application depends on 

sorun olduğunu biz QML dosyasına göre yolu kullanmak zorunda Image QML öğe için görüntü dosyasını belirtmek amacıyla ?! Bu kesinlikle delilik. Geliştirme dosyaları sırasında bazen klasörler arasında hareket eder (QML dosyasını taşıyorsunuz ve sahip olduğu tüm yolu düzeltmeniz gerekiyor ?!); Bazı farklı QML dosyaları aynı görüntüye başvurmalıdır (aynı resim kaynağı ancak farklı QML dosyalarındaki farklı gerçek yol).

Soru şu: uygulama yoluna göre resim yolu nasıl belirlenir? Bütün bunlar mümkün mü?

Şimdiden teşekkürler!

PS. Qt kaynak sisteminin kullanılması (kaynaklar yürütülebilir dosyaya yerleştirildiğinde) bizim durumumuzda bir seçenek değildir. Diskte ham kaynaklara ihtiyacımız var (QML dosyaları dahil, en azından geliştirme aşamasında).

PPS. Bu sorunu belgenin/google/stackoverflow yoluyla kendim çözmem için tüm günü harcadıktan sonra yazdım; Hiç başarı yok (çoğu örnek kaynak yerleştirmeyi kullanır, diğerleri çok basittir ve sadece göreli yolları kullanır). Eğer görüntüler için bir .qrc dosyasını kullanamıyorsanız

+0

'Bu kesinlikle delice. Geliştirme dosyaları sırasında bazen klasörler arasında taşındı (QML dosyasını taşıyorsunuz ve sahip olduğu tüm yolu düzeltmeniz gerekiyor?!); -> Geliştirme ifadesi sırasında geliştirme konusunda deli olan nedir? Açıkça tasarlamıyorsanız, sadece kargo tarikat programlaması yapın, yeni tasarımla yeniden tadilat yapmanız gerekebilir. Aynı zamanda bir şeyi yeniden adlandırdığınızda her yerde bir şeyi yeniden adlandırmanız da bir çılgınlık mıdır? Çünkü bir değişkene yanlış ad verdiğinizi fark ettiniz mi? Hadi, Alexey ... :) Sed senin arkadaşın ... – lpapp

+2

@lpapp Bu çılgınca çünkü görüntü dosyası aynı yerde kalıyorsa, normalde bu dosyanın referansının uygulama kodunda aynı kalmasını istemek normaldir. ve başka şeyleri hareket ettirmeye bağlı değildir. Değil mi Bazı QML dosyaları bazı görüntülere başvurursa ve bu görüntü her zaman aynı yerde kalırsa, neden bu QML'yi her defasında başka bir klasöre taşımak istediğinizi düzeltmek gerekir? Ben bundan bahsediyorum. Qrc dosyalarını kullanırken böyle bir probleminiz yok, ancak ham kaynaklar ile maalesef bir çözüm bulamıyoruz. –

cevap

10

, bu deneyebilirsiniz: QML yılında

#include <QGuiApplication> 
#include <QQmlApplicationEngine> 
#include <QQmlContext> 

int main(int argc, char *argv[]) 
{ 
    QGuiApplication app(argc, argv); 

    QQmlApplicationEngine engine; 
    engine.rootContext()->setContextProperty("applicationDirPath", QGuiApplication::applicationDirPath()); 
    engine.load(QUrl(QStringLiteral("qrc:/main.qml"))); 

    return app.exec(); 
} 

, daha sonra yaparım:

Image { 
    source: "file:///" + applicationDirPath + "/../resources/images/image.png" 
} 

Not bu kod o test edilmedi.

+2

Teşekkürler @Mitch! Olası bir çözüm gibi görünüyor. Sadece test ettim. Düzgün çalışabilmesi için '' qguiApplication :: applicationDirPath() '' '' 'file: ///' 'dizinini eklemeniz gerekir. Ve bu uygulama tarafından yüklenen tüm QML dosyalarında bulunan 'applicationDirPath' değerinin enjekte edildiği, sadece engine.load (...) 'tarafından yüklenen ana bilgisayarda değil (başlangıçta bunun hakkında endişeliydim) görünüyor. Aktarılan kaynak yolunda '/../' önlemek ve QT Creator'da ve bağımsız uygulama çalışmalarında hata ayıklama işlemlerinde çalışmak için, işlemin geçerli çalışma dizinini geçirerek biraz geliştirilebilir. Çok teşekkürler! –

+0

Bunu bir ölçütle test etmediğim gibi diyemedim. Qt Creator'un proje sihirbazı ile bir kıyaslama yapmak çok kolay olsa da (bir QML kıyaslaması bile olsa) ve Creator'un QML Profiler'i herhangi bir darboğaz saptamanıza yardımcı olabilir. – Mitch

+0

Teşekkür ederiz @Mitch! QML profillerini araştıracak. –

1
Image { 
    source: "file:resources/images/image.png" 
} 

çalışacak çalışma dizini ApplicationFolder ayarlanırsa eğer

not: Uygulama aslında çalışıyorsa hangi dizin QtCreator, tekrar kontrol dan çalıştırırken (benim evde benim uygulama çalıştırmak vardı dizini çalışma dizini doğru şekilde ayarlanmış olsa bile (bu, bir terminal penceresinde bir kez çalıştırdıktan sonra bu sihirli olarak kendini sabitledi))

İlgili konular