Autor Wątek: Qt 5.2 Resources problem  (Przeczytany 3716 razy)

Offline Bimbol

  • Użytkownik

# Styczeń 27, 2014, 17:42:32
Witam, napotkałem się na problem z zasobami w Qt. Dodaję do zasobów icony w formacie .png, jednak nie są one wczytywane. Działa mi tylko ścieżka bezpośrednia. W efekcie mam po prostu puste miejsca, w których powinny być ikony.

Kod w którym wczytuje ikony:
void Notepad::createFileActions()
{
   newAction = new QAction(QIcon(":/icon/icon/new.png"), tr("&Nowy"), this);
   newAction->setStatusTip(tr("Nowy plik."));
   newAction->setShortcut(QKeySequence::New);

   openAction = new QAction(QIcon(":/icon/icon/open.png"), tr("&Otwórz"), this);
   openAction->setStatusTip(tr("Otwórz istniejący plik."));
   openAction->setShortcut(QKeySequence::Open);

   saveAction = new QAction(QIcon(":/icon/icon/save.png"), tr("&Zapisz"), this);
   saveAction->setStatusTip(tr("Zapisz plik."));
   saveAction->setShortcut(QKeySequence::Save);

   quitAction = new QAction(tr("&Wyjście"), this);
   quitAction->setStatusTip(tr("Wyjdź z programu."));
   quitAction->setShortcut(Qt::CTRL + Qt::Key_Q);
   connect (quitAction, SIGNAL(triggered()), qApp, SLOT(quit()));
}

void Notepad::createEditActions()
{
   copyAction = new QAction(QIcon(":/icon/icon/copy.png"), tr("&Kopiuj"), this);
   copyAction->setStatusTip(tr("Kopiuj."));
   copyAction->setShortcut(QKeySequence::Copy);

   pasteAction = new QAction(QIcon(":/icon/icon/paste.png"), tr("&Wklej"), this);
   pasteAction->setStatusTip(tr("Wklej."));
   pasteAction->setShortcut(QKeySequence::Paste);

   cutAction = new QAction(QIcon(":/icon/icon/cut.png"), tr("Wy&tnij"), this);
   cutAction->setStatusTip(tr("Wytnij."));
   cutAction->setShortcut(QKeySequence::Cut);
}

Plik KursQt3.pro:
#-------------------------------------------------
#
# Project created by QtCreator 2014-01-26T22:49:03
#
#-------------------------------------------------

QT       += core gui

greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

TARGET = KursQt3
TEMPLATE = app


SOURCES += main.cpp\
        notepad.cpp

HEADERS  += notepad.h

RESOURCES = icons.qrc

Dodam tylko, że używałem opcji "Skopiuj ścieżkę z zasobami do schowka", ale nawet ta ścieżka nie działa.

Zdjęcia zasobów i folderu z projektem w załącznikach.
Kod oczywiście się kompiluje i działa jak należy.

Pozdrawiam.

Offline Mr. Spam

  • Miłośnik przetworów mięsnych

Offline Xirdus

  • Redaktor

# Styczeń 27, 2014, 21:14:02
A jak raz dasz /icon/ w ścieżce to działa?

QtCreator ma taką fajną funkcję że każdy plik który generuje można także otworzyć w edytorze w wersji tekstowej - przydatne przy szukaniu błędów.

Offline Bimbol

  • Użytkownik

# Styczeń 27, 2014, 23:28:44
Niestety kombinowałem ze zmianą ścieżki na wiele sposobów, bez skutku. Szukałem w google, rozwiązania, ktoś napisał by dodać qrc na sam przód, też nie działa.

Sprawdziłem to w Qt Designer i tam po stworzeniu akcji ikony są widoczne. Z ciekawości sprawdziłem jaki kod wygenerowało.

Oto efekt:
        actionOpen = new QAction(MainWindow);
        actionOpen->setObjectName(QStringLiteral("actionOpen"));
        QIcon icon;
        icon.addFile(QStringLiteral(":/icon/icon/open.png"), QSize(), QIcon::Normal, QIcon::Off);
        actionOpen->setIcon(icon);

Co prawda fragment, ale widać, że ścieżki które podałem są dobre.

Użyłem tego kodu w moim programie i tam znów to samo, nie działa.

Offline Xirdus

  • Redaktor

# Styczeń 28, 2014, 00:57:24
Jak to zadziała, to rzucam Qt, ale... co jeśli owiniesz ścieżki w funkcję QStringLiteral?

Offline Bimbol

  • Użytkownik

# Styczeń 28, 2014, 01:09:43
Próbowałem, niestety nic z tego. Po prostu ręce opadają.

Znalazłem coś takiego w sieci: http://qt-project.org/doc/qt-5/qtwidgets-mainwindows-application-example.html#the-resource-file

I co ciekawe w tym przypadku widać ikonki. Jednak podczas próby stworzenia aplikacji na podstawie tej, otrzymuje błędy linkera. Próbując zbudować ten program drugi raz od nowa, również wyrzuca błędy linkera.

Btw. jakiego kompilatora używasz? Budowałeś Qt ze źródeł?

Offline aphity

  • Użytkownik

# Styczeń 28, 2014, 01:23:44
Zasoby w Qt potrafią być problematyczne :< Może dodanie slasha '/' na końcu pola "przedrostek" coś zmieni?

Offline julia

  • Użytkownik

# Styczeń 28, 2014, 01:34:19
Niestety mam ten sam problem... Bezpośrednia ścieżka działa, niestety tylko bezpośrednia.

Offline Bimbol

  • Użytkownik

# Styczeń 28, 2014, 02:14:06
Wpadłem na pewien pomysł. Otóż stworzyłem formularz .ui i dodałem tam akcje wraz z ikonami z zasobów.
Następnie skompilowałem program i udałem sie do folderu po kompilacji. Można tam znaleźć nagłówek naszego formularza.

Po czym ponownie otworzyłem projekt i wyrzuciłem z nazwaprojektu.pro FORMS, gdyż nie chciałem używać dłużej Formularza. Przerobiłem nagłówek formularza, tak by pokazywał tylko to co chce i dodałem to do mojej klasy. Następnie niepotrzebny nagłówek formularza skasowałem i powstało coś takiego:

main.cpp:
#include "mainwindow.h"
#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    w.show();

    return a.exec();
}

mainwindow.cpp:
#include "mainwindow.h"

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
{
    resize(400, 300);
    actionOpen = new QAction(QIcon(":/icon/icon/open.png"), "&Cut", this);
    actionOpen2 = new QAction(QIcon(":/icon/icon/open2.png"), "&Cut2", this);
    actionCut = new QAction(QIcon(":/icon/icon/cut.png"), "Cut", this);

    mainToolBar = new QToolBar(this);
    addToolBar(mainToolBar);

    mainToolBar->addAction(actionOpen);
    mainToolBar->addAction(actionOpen2);
    mainToolBar->addAction(actionCut);
}

MainWindow::~MainWindow()
{

}

mainwindow.h:
#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QtCore/QVariant>
#include <QtWidgets/QAction>
#include <QtWidgets/QApplication>
#include <QtWidgets/QButtonGroup>
#include <QtWidgets/QHeaderView>
#include <QtWidgets/QMainWindow>
#include <QtWidgets/QMenuBar>
#include <QtWidgets/QStatusBar>
#include <QtWidgets/QToolBar>
#include <QtWidgets/QWidget>

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = 0);
    ~MainWindow();
private:
    QAction *actionOpen;
    QAction *actionOpen2;
    QAction *actionCut;
    QToolBar *mainToolBar;
};

#endif // MAINWINDOW_H

kolejnytest.pro:
#-------------------------------------------------
#
# Project created by QtCreator 2014-01-28T01:02:26
#
#-------------------------------------------------

QT       += core gui

greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

TARGET = kolejnytest
TEMPLATE = app


SOURCES += main.cpp\
        mainwindow.cpp

HEADERS  += mainwindow.h

RESOURCES += \
    icons.qrc

I ciekawostka, wykorzystałem ten kod do nowego projektu, który nie używa formularza i co mnie zdziwiło ikony się wyświetlają jak należy. Nie wiem czy to kaprys Qt, ale jak na razie działa. Jutro spróbuje stworzyć większy projekt i się okaże, czy będą problemy czy też nie.

Osoby mające problem z ikonami, zachęcam do przetestowania ww. kodu.