🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Thread View: pl.comp.lang.c
15 messages
15 total messages Started by szykcech Sat, 29 Dec 2018 12:02
C++, Qt, Pluginy
#309762
Author: szykcech
Date: Sat, 29 Dec 2018 12:02
26 lines
4089 bytes
Witam
Piszę edytor tekstu (Textprofan 4) w oparciu o bibliotekę Qt. Program jest modułowy składa się z małego exe, kilku bibliotek i 2 pluginów (na początek). Pluginy są ładowane dynamicznie (jednak na starcie programu) przewidywane jest ich włączanie i wyłączanie wg uznania (ze zwalnianiem pamięci a nie jedynie ukrywanie).

W pluginie libTextEditorPluginD.so mam funkcjonalność pojedynczego edytora (zawiera on fabrykę obiektów edytora z których każdy składa się z kontrolki (ang. widget) zawierającego właściwy edytor (dziedziczący po QPlainTextEdit) - jest to wygodne i rozwijalne gdyby np. komuś zamarzyło się kiedyś dodawanie nowych elementów takich jak pasek przycisków funkcyjnych czy panel wyszukiwania i zamiany.

W pluginie libSyntaxHighlighterPluginD.so mam funkcjonalność kolorowania składni oraz korekty pisowni (wynika to z tego, że nie może być 2 obiektów kolorujących podłączonych do jednego edytora QPlainTextEdit). 

Problem mam taki:
W pluginie libSyntaxHighlighterPluginD.so mam wywołanie zwrotne (ang. callback) który wywołuje libTextEditorPluginD.so za pośrednictwem fabryki obiektów Pluigns (w bibliotece z programem głównym). Problem w tym, że używam w libSyntaxHighlighterPluginD.so rzutowania z pomocą qobject_cast (co jest chyba zalecaną metodą). Do działania tego rzutowania potrzebne są meta dane z klasy na którą rzutuję, czyli TextEditorPlugin::TextEditor z pluginu libTextEditorPluginD.so. I okazuje się, że plugin libSyntaxHighlighterPluginD.so nie może być załadowany, bo nie widzi funkcji implementowanej przez makro Q_OBJECT klasy TextEditorPlugin::TextEditor z libTextEditorPluginD.so. Faktycznie początkowo jego brakowało, ale je dodałem wyczyściłem projekt i usunąłem pluginy z dysku i skompilowałem to wszystko od zera i nadal zgłasza taki błąd:

Exception occurs! Sender: Textprofan.so, Error code: 3
Message:
File: ../../../../Textprofan4/Src/Libs/TextprofanLib/Src/Factories/Plugins.cpp, in line: 140, in function: loadPlugin
Error code: 3, Error message: SyntaxHighlighterPlugin plugin load failed! Path: /home/szyk/!-pro/Textprofan4-work/Plugins/libSyntaxHighlighterPluginD.so
Error message: Cannot load library /home/szyk/!-pro/Textprofan4-work/Plugins/libSyntaxHighlighterPluginD.so.1.0.0: (/home/szyk/!-pro/Textprofan4-work/Plugins/libSyntaxHighlighterPluginD.so.1.0.0: undefined symbol: _ZN16TextEditorPlugin10TextEditor16staticMetaObjectE)

Sprawdzałem Midnight Commander-em i ta funkcja jest w tym pliku libTextEditorPluginD.so
który jest ładowany prawidłowo:

"TextEditorPlugin plugin dependency checked. Path: /home/szyk/!-pro/Textprofan4-work/Plugins/libTextEditorPluginD.so"
"TextEditorPlugin plugin sucessfuly loaded. Path: /home/szyk/!-pro/Textprofan4-work/Plugins/libTextEditorPluginD.so"

Ma ktoś doświadczenie z programami z pluginami i mógłby pomóc?

dzięki za cierpliwość i za dobre chęci i szczęśliwego Nowego Roku!
Szyk Cech
Re: C++, Qt, Pluginy
#309763
Author: Borneq
Date: Sat, 29 Dec 2018 13:46
26 lines
2571 bytes
W dniu 29.12.2018 o 13:02, szykcech@gmail.com pisze:
> Witam
> Piszę edytor tekstu (Textprofan 4) w oparciu o bibliotekę Qt. Program jest modułowy składa się z małego exe, kilku bibliotek i 2 pluginów (na początek). 
To ciekawe, bo kiedyś pisałem edytor jeszcze z użyciem starego Delphi 6 
i SynEdita, który już nie był rozwijany od dawna, ale cały czas go 
używam bo wygodny.
I nawet myślałem, aby napisać jego nową wersję najlepiej w C++.
Jak mieć dostęp do programu? Mam pomysły na niektóre funkcje.
Możliwość wielu dokumentów u mnie było robiona przez MDI, które jest 
niekompatybilne z Linuxem, dla Qt to chyba będzie widget z tabami.

Moje pomysły: w menu Files jest coś takiego jak Recent Files - dodane 
menu które pokazuje je posortowane po czasie zamknięcia, po nazwie czy 
ścieżce pliku. Nazwy plików są u mnie w pliku ini w katalogu gdzie 
binarka Editasa.
Ale jak wiadomo - lista ostatnio użytych plików szybko się zapełnia, gdy 
używam F4 wraz z podłączonym edytorem do TotalCommandera.
Więc u mnie zrobiłem dodatkowe menu Folders,  gdzie pogrupowałem w 
folderach najważniejsze pliki tekstowe, które używam. Zresztą, to 
grupowanie w foldery nie sprawdziło się, bo używam tylko list - 
posortowanej według ostatniego zamknięcia i alfabetycznie według nazwy 
pliku (nie ścieżki)
Ważną właściwością mojego edytora są krótkie zaszyfrowane notatki. Jeśli 
plik ma rozszerzenie .een , wtedy traktuje to jako zaszyfrowany tekst.
U mnie rozpoznaje czy tekst jest UTF8 czy Windows 1250 po BOM, choć 
obecnie warto stosować UTF8 zawsze, bo często pliki xml są UTF8 bez BOM.
Re: C++, Qt, Pluginy
#309764
Author: szykcech
Date: Sat, 29 Dec 2018 14:03
14 lines
2202 bytes
> Możliwość wielu dokumentów u mnie było robiona przez MDI, które jest 
> niekompatybilne z Linuxem, dla Qt to chyba będzie widget z tabami.

Na Linuxie czy gdziekolwiek indziej Qt wspiera Mdi jak i taby...

Co do twoich pomysłów:

Przewiduję interfejs na tabach (Mdi da się, ale jest to kompletnie przestarzałe i nie wygodne).

Ofszem miałem w starej wersji historię otwartych dokumentów i planuję dodać to w nowej. Jednak tu bez udziwnień: tylko otwarcie poprzedniego w historii standardowym przeglądarkowym w+shift+ctrl lub z menu.

Co do szyfrowanych plików to ciekawa sprawa i w obrębie mojej architektury istnieje możliwość dodatnia specjalnego pluginu dekodera (automatycznego lub z podaniem hasła).

Jednak przyznam szczerze ten edytor piszę na własne potrzeby i raczej nie planuję go udostępniać. On jest dla mnie poligonem do coraz lepszego poznawania biblioteki Qt.
Re: C++, Qt, Pluginy
#309765
Author: szykcech
Date: Sat, 29 Dec 2018 14:08
2 lines
1457 bytes
> standardowym przeglądarkowym w+shift+ctrl lub z menu.
Oczywiście miało być t+shift+ctrl .
Re: C++, Qt, Pluginy
#309766
Author: Borneq
Date: Sat, 29 Dec 2018 14:17
8 lines
1511 bytes
W dniu 29.12.2018 o 15:03, szykcech@gmail.com pisze:
> Jednak przyznam szczerze ten edytor piszę na własne potrzeby i raczej nie planuję go udostępniać. On jest dla mnie poligonem do coraz lepszego poznawania biblioteki Qt.

To napiszę coś własnego. Raczej nie będę rozwijał budowy modułowej,
ale chciałem zapytać się o użytą technologię:
widget edytora to jest standardowo brany z Qt? Bo są również jakieś 
wrappery Scintilli.
jaka klasa służy do podświetlania składni oraz sprawdzania pisowni?
Re: C++, Qt, Pluginy
#309767
Author: szykcech
Date: Sat, 29 Dec 2018 20:17
12 lines
1843 bytes
> widget edytora to jest standardowo brany z Qt?

Tak.

>  Bo są również jakieś 
> wrappery Scintilli.

Nie używam i po źródłach Notepad++ widać, że to raczej szambo...

> jaka klasa służy do podświetlania składni oraz sprawdzania pisowni?
Z Kde KSyntaxhighlighting, chyba stąd:
https://github.com/KDE/syntax-highlighting
Re: C++, Qt, Pluginy
#309768
Author: Borneq
Date: Sat, 29 Dec 2018 20:33
13 lines
1453 bytes
W dniu 29.12.2018 o 21:17, szykcech@gmail.com pisze:
>> widget edytora to jest standardowo brany z Qt?
> 
> Tak.

QPlainTextEdit?

>> jaka klasa służy do podświetlania składni oraz sprawdzania pisowni?
> Z Kde KSyntaxhighlighting, chyba stąd:
> https://github.com/KDE/syntax-highlighting
> 

Potem jakoś przyłącza się ten highlighter do QPlainTextEdit'a?
Re: C++, Qt, Pluginy
#309769
Author: szykcech
Date: Sat, 29 Dec 2018 20:44
40 lines
3322 bytes
W dniu sobota, 29 grudnia 2018 21:33:49 UTC+1 użytkownik Borneq napisał:
> W dniu 29.12.2018 o 21:17, szykcech@gmail.com pisze:
> >> widget edytora to jest standardowo brany z Qt?
> > 
> > Tak.
> 
> QPlainTextEdit?

Tak. 

> >> jaka klasa służy do podświetlania składni oraz sprawdzania pisowni?
> > Z Kde KSyntaxhighlighting, chyba stąd:
> > https://github.com/KDE/syntax-highlighting
> > 
> 
> Potem jakoś przyłącza się ten highlighter do QPlainTextEdit'a?

Robisz coś w stylu:
MyEditor: public QPlainTextEdit
{
protected:
    SyntaxHighlighter* mSyntaxHighlighter = nullptr;
    KSyntaxHighlighting::Repository mRepository;
};

I potem w cpp:
MyEditor::MyEditor(QWidget* aParent) : QPlainTextEdit(aParent)
{
    mSyntaxHighlighter = new SyntaxHighlighter(document());
}

Potem w funkcji openFile(QString aFileName) ładujesz plik i robisz detekcję rodzaju wg nazwy lub rozszerzenia - niestety wykrywanie pliku po zawartości chyba nie działa, wiec ja obsługiwałem to na piechotę dla plików jakich używam.
Standardowa detekcja wygląda tak:

KSyntaxHighlighting::Definition lDef = mRepository.definitionForFileName(mInputFileInfo->mFileName);
        if(!lDef.isValid() && mInputFileInfo->mExt.length())
            lDef = mRepository.definitionForFileName(C::gBaseName(mInputFileInfo->mFileName, false) + '.' + mInputFileInfo->mExt);   // try open file detected by content
        if(lDef.isValid()) mSyntaxHighlighter->setDefinition(lDef);

Tak mam zrobione w wersji monolitycznej. Użyte funkcje z mojej biblioteki są samo opisowe, więc nie będę tłumaczył (jedynie podam, że C::gBaseName(mInputFileInfo->mFileName, false)  zwraca nazwę pliku bez rozszerzenia).
Re: C++, Qt, Pluginy
#309770
Author: Borneq
Date: Sat, 29 Dec 2018 21:29
17 lines
1863 bytes
W dniu 29.12.2018 o 21:44, szykcech@gmail.com pisze:
>>>> jaka klasa służy do podświetlania składni oraz sprawdzania pisowni?
>>> Z Kde KSyntaxhighlighting, chyba stąd:
>>> https://github.com/KDE/syntax-highlighting
>>>
>>
>> Potem jakoś przyłącza się ten highlighter do QPlainTextEdit'a?
> 
> Robisz coś w stylu:
> MyEditor: public QPlainTextEdit

Udało się skompilować przykłąd codeeditor z Kde KSyntaxhighlighting pod 
Mintem z użyciem cmake.
Może w Windows będzie trudniej, bo trzeba i cmake zainstalować, i czy 
cmake znajdzie wszystkie ścieżki.
Na przykład w Mintcie musiałem jeszcze skompilować:
git clone git://anongit.kde.org/extra-cmake-modules
Re: C++, Qt, Pluginy
#309772
Author: Borneq
Date: Sun, 30 Dec 2018 08:58
10 lines
2050 bytes
W dniu 29.12.2018 o 13:02, szykcech@gmail.com pisze:
> Program jest modułowy składa się z małego exe, kilku bibliotek i 2 pluginów (na początek). Pluginy są ładowane dynamicznie (jednak na starcie programu) przewidywane jest ich włączanie i wyłączanie wg uznania (ze zwalnianiem pamięci a nie jedynie ukrywanie).
> 
> W pluginie libTextEditorPluginD.so mam funkcjonalność pojedynczego edytora (zawiera on fabrykę obiektów edytora z których każdy składa się z kontrolki (ang. widget) zawierającego właściwy edytor (dziedziczący po QPlainTextEdit) - jest to wygodne i rozwijalne gdyby np. komuś zamarzyło się kiedyś dodawanie nowych elementów takich jak pasek przycisków funkcyjnych czy panel wyszukiwania i zamiany.
> 
> W pluginie libSyntaxHighlighterPluginD.so mam funkcjonalność kolorowania składni oraz korekty pisowni (wynika to z tego, że nie może być 2 obiektów kolorujących podłączonych do jednego edytora QPlainTextEdit).

Pluginy tworzy się za pomocą wybrania opcji Qt plugin
http://doc.qt.io/qt-5/plugins-howto.html
czy też są to niezależne, dynamiczne biblioteki, czy Qt wspiera je jakoś?
Re: C++, Qt, Pluginy
#309773
Author: szykcech
Date: Sun, 30 Dec 2018 13:17
17 lines
3485 bytes
W dniu niedziela, 30 grudnia 2018 09:58:04 UTC+1 użytkownik Borneq napisał:
> W dniu 29.12.2018 o 13:02, szykcech@gmail.com pisze:
> > Program jest modułowy składa się z małego exe, kilku bibliotek i 2 pluginów (na początek). Pluginy są ładowane dynamicznie (jednak na starcie programu) przewidywane jest ich włączanie i wyłączanie wg uznania (ze zwalnianiem pamięci a nie jedynie ukrywanie).
> > 
> > W pluginie libTextEditorPluginD.so mam funkcjonalność pojedynczego edytora (zawiera on fabrykę obiektów edytora z których każdy składa się z kontrolki (ang. widget) zawierającego właściwy edytor (dziedziczący po QPlainTextEdit) - jest to wygodne i rozwijalne gdyby np. komuś zamarzyło się kiedyś dodawanie nowych elementów takich jak pasek przycisków funkcyjnych czy panel wyszukiwania i zamiany.
> > 
> > W pluginie libSyntaxHighlighterPluginD.so mam funkcjonalność kolorowania składni oraz korekty pisowni (wynika to z tego, że nie może być 2 obiektów kolorujących podłączonych do jednego edytora QPlainTextEdit).
> 
> Pluginy tworzy się za pomocą wybrania opcji Qt plugin
> http://doc.qt.io/qt-5/plugins-howto.html
> czy też są to niezależne, dynamiczne biblioteki, czy Qt wspiera je jakoś?

Tak to są normalne dynamiczne biblioteki o standardowym interfejsie używanym przez Qt. Ma to 2 zalety:
+ plik Json opisuje Ci plugin i można ten plik (json z biblioteki współdzielonej) pobrać bez ładowania całego pluginu. Ma to znaczenie np. w Qt Creatorze który w całości opiera się na pluginach i są między nimi zależności (wersje). Nawet mimo, że wszystkie te pluginy i tak są przygotowywane przez Qt i kompilowane razem z całym Qt Creatorem - ale formalnie jest furtka dla niezależnych programistów którzy chcieli by dodać swój zamknięty plugin (lub taki którego nie chce Qt).
+ plugin udostępnia standardowy interfejs - ładuje określoną klasę która pełni rolę fabryki obiektów dla obiektów udostępnianych przez plugin.

Poza tym możesz tworzyć standardowe biblioteki współdzielone ładowane na starcie programu.
Re: C++, Qt, Pluginy
#309771
Author: szykcech
Date: Sun, 30 Dec 2018 13:32
4 lines
1834 bytes
> Na przykład w Mintcie musiałem jeszcze skompilować:
> git clone git://anongit.kde.org/extra-cmake-modules

Pod WinDos tak samo trzeba to skompilować. To jakieś wewnętrzne parametry Kde.
Re: C++, Qt, Pluginy
#309774
Author: Borneq
Date: Sun, 30 Dec 2018 20:16
20 lines
2095 bytes
W dniu 30.12.2018 o 14:17, szykcech@gmail.com pisze:
> + plik Json opisuje Ci plugin i można ten plik (json z biblioteki współdzielonej) pobrać bez ładowania całego pluginu. Ma to znaczenie np. w Qt 

Z tym plikiem json to ciekawe, bo
pytałem na forum Qt i mam linki
http://doc.qt.io/qt-5/qtwidgets-tools-echoplugin-example.html
http://doc.qt.io/qt-5/qpluginloader.html

Ten pierwszy, jest co prawda pluginem robiącym konkretną rzecz, ale 
tutaj obie strony wiedzą co ma robić, natomiast kłopot jest z pluginami, 
które by miały mieć całkiem nową funkcjonalność, nieprzewidzianą przez 
program główny.
Mam coś takiego: w programie głównym jest klasa dziedzicząca po 
QPlainTextEdit nazywająca się CodeEditor.
Klasa ta korzysta z bilbioteki statycznej dla takich rzeczy jak
    KSyntaxHighlighting::Repository m_repository;
    KSyntaxHighlighting::SyntaxHighlighter *m_highlighter;
Teraz trzeba by coś opisać w jsonie, żeby bez pluginu zadziałał w 
uproszczony sposób, bez kolorowania, a gdy wśród pluginów będzie plugin 
kolorowania, to aby kolorował.
Re: C++, Qt, Pluginy
#309775
Author: szykcech
Date: Sun, 30 Dec 2018 20:31
25 lines
3519 bytes
W dniu niedziela, 30 grudnia 2018 21:16:12 UTC+1 użytkownik Borneq napisał:
> W dniu 30.12.2018 o 14:17, szykcech@gmail.com pisze:
> > + plik Json opisuje Ci plugin i można ten plik (json z biblioteki współdzielonej) pobrać bez ładowania całego pluginu. Ma to znaczenie np. w Qt 
> 
> Z tym plikiem json to ciekawe, bo
> pytałem na forum Qt i mam linki
> http://doc.qt.io/qt-5/qtwidgets-tools-echoplugin-example.html
> http://doc.qt.io/qt-5/qpluginloader.html
> 
> Ten pierwszy, jest co prawda pluginem robiącym konkretną rzecz, ale 
> tutaj obie strony wiedzą co ma robić, natomiast kłopot jest z pluginami, 
> które by miały mieć całkiem nową funkcjonalność, nieprzewidzianą przez 
> program główny.
> Mam coś takiego: w programie głównym jest klasa dziedzicząca po 
> QPlainTextEdit nazywająca się CodeEditor.
> Klasa ta korzysta z bilbioteki statycznej dla takich rzeczy jak
>     KSyntaxHighlighting::Repository m_repository;
>     KSyntaxHighlighting::SyntaxHighlighter *m_highlighter;
> Teraz trzeba by coś opisać w jsonie, żeby bez pluginu zadziałał w 
> uproszczony sposób, bez kolorowania, a gdy wśród pluginów będzie plugin 
> kolorowania, to aby kolorował.

Json będzie częścią pluginu jeśli go zrobisz. Natomiast bez niego Json jest po nic. W sumie ja w swoim edytorze mam przewidziane 3 rodzaje pluginów: editor, view i tool. I ładuję plugin który sam się rejestruje w programie (wywołuję jedynie funkcję pluginu z parametrem fabryki pluginów Plugins). A wcześniej w systemie się rejestruje plugin edytora. I w momencie gdy jest tworzony nowy edytor wywoływana jest lista zarejestrowanych funkcji std::function (callback) które robią określone rzeczy na tym nowym obiekcie.
Json w tym momencie jest tylko do określenia typu pluginu oraz do ustalenia zależności między pluginami (który ma się ładować jako pierwszy). Podobnie jest zrobiony Qt Creator - na nim się (luźno) wzorowałem.
Zaś typ pluginu jest mi potrzebny tylko do zapytania jaki plugin ma być domyślny do wyświetlania - biorę do tej listy tylko pluginy editor i view.
Re: C++, Qt, Pluginy
#309776
Author: szykcech
Date: Mon, 31 Dec 2018 19:49
3 lines
1649 bytes
> Ma ktoś doświadczenie z programami z pluginami i mógłby pomóc?

Dzięki już nie trzeba. Problem był w tym, że w pluginie SyntaxHighligterPlugin nie było podlinkowanego pluginu TextEditorPlugin a to jest konieczne by móc użyć jego zawartości - atuomagicznie one się nie widzą...
Thread Navigation

This is a paginated view of messages in the thread with full content displayed inline.

Messages are displayed in chronological order, with the original post highlighted in green.

Use pagination controls to navigate through all messages in large threads.

Back to All Threads