Проблема в следующем, ни как не могу слинковать код. В qtcreator есть библиотека libDuiEditor. Я ее подключаю к своему проекту. Код компилируется, но линковщик в упор не хочет видеть этот модуль.
undefined reference to `DuiEditor::Internal::DuiEditorPlugin::DuiEditorPlugin()
DuiEditor::Internal::DuiEditorPlugin *plugin =new DuiEditor::Internal::DuiEditorPlugin();
#ifndef DUIEDITORPLUGIN_H
#define DUIEDITORPLUGIN_H
#include <extensionsystem/iplugin.h>
namespace TextEditor {
class TextFileWizard;
class TextEditorActionHandler;
} // namespace TextEditor
namespace DuiEditor {
namespace Internal {
class DuiEditorFactory;
class DuiCodeCompletion;
class ScriptEditor;
class DuiEditorPlugin : public ExtensionSystem::IPlugin
{
Q_OBJECT
public:
DuiEditorPlugin();
virtual ~DuiEditorPlugin();
// IPlugin
bool initialize(const QStringList &arguments, QString *errorMessage = 0);
void extensionsInitialized();
static DuiEditorPlugin *instance()
{ return m_instance; }
void initializeEditor(ScriptEditor *editor);
private:
void registerActions();
static DuiEditorPlugin *m_instance;
typedef QList<int> Context;
Context m_context;
Context m_scriptcontext;
TextEditor::TextFileWizard *m_wizard;
DuiEditorFactory *m_editor;
TextEditor::TextEditorActionHandler *m_actionHandler;
DuiCodeCompletion *m_completion;
};
} // namespace Internal
} // namespace DuiEditor
#endif // DUIEDITORPLUGIN_H
Покажи .pro файл.
LIBS += -lDuiEditor
QPluginLoader plugin("/usr/lib/libDuiEditor.so");
QObject *obj = qobject_cast<QObject *>(plugin.instance());
if (obj){
qDebug() << "Загрузили";
DuiEditorPlugin *dui = qobject_cast<DuiEditorPlugin *>(obj);
}
/usr/include/QtCore/qobject.h:443: undefined reference to `DuiEditor::Internal::DuiEditorPlugin::staticMetaObject'
ИМХО без правки исходников не обойтись. Дело в том, что если вы хотите использовать какой-то класс определенный в динамической библиотеке, этот класс должен из нее экспортироваться. Т.е. класс должен быть объявлен так:
class DUIEDITOR_EXPORT DuiEditorPlugin : public ExtensionSystem::IPlugin
class DUIEDITOR_EXPORT DuiEditorPlugin : public ExtensionSystem::IPlugin
heiheshang, что-то я в Git-хранилище этого DuiEditor не вижу. Может прибили уже?
Disclaimer: пишу все чисто теоретически - на практике ничего из нижеперечисленного не делал.
Если вы действительно хотите взяться за это, то приготовьтесь потянуть себе много всего из QtCreator. Вот мне кажется минимум:
1) ExtensionSystem - загрузка и управление плагинами
2) Aggregation - аггрегация объектов
3) CorePlugin - собственно ядро QtCreator. Требуется для работы любого плагина.
4) TextEditor - требуется для DuiEditor
5) Find, QuickOpen - требуются для TextEditor
6) Сам DuiEditor
Далее приготовьтесь:
1) Необходимо загрузить и инициализировать все плагины. Этим занимается PluginManager из ExtensionSystem. Как это делается можно посмотреть в qtcreator/app/main.cpp.
2) Core при загрузке создает главное окно приложения. Т.е. создастся окно QtCreator с меню и панельками.
3) Когда плагин инициализируется, он регистрирует все объекты, которые предоставляет, в PluginManager. Соответственно, если вы хотите использовать этот функционал, то вам нужно получать эти объекты из PluginManager-а или можно воспользоваться интерфейсом ICore. Второй вариант гораздо проще.
Конкретно DuiEditor экспортирует:
- фабрику классов для создания редакторов.
- визард для создания QML файлов
- объект Code Completion
- подсветку редактора
Для примера, допустим что вам нужно открыть редактор QML. Класс ICore предоставляет доступ к различным менеджерам. В том числе, там есть EditorManager. Этот менеджер управляет редакторами и может их создавать (внутри у него есть список всех зарегистрированных фабрик). Создать редактор можно так:
IEditor* editor = ICore::instance()->editorManager()->openEditor(fileName, "application/x-dui");
frg10
Копание в коде привело меня к такому результату
QString titlePattern = tr("Memory $");
EditorManager* manager = EditorManager::instance();
IEditor* editor = manager->openEditorWithContents(Core::Constants::K_DEFAULT_TEXT_EDITOR, &titlePattern);
А что, то что я написал не работает? Вы все плагины загрузили?
ASSERTION style FAILED AT manhattanstyle.cpp:101
ExtensionSystem::PluginManager pluginManager;
pluginManager.setFileExtension(QLatin1String("pluginspec"));
QStringList pluginPaths;
pluginPaths << qApp->applicationDirPath()+"/plugins";
pluginManager.setPluginPaths(pluginPaths);
const PluginSpecSet plugins = pluginManager.plugins();
ExtensionSystem::PluginSpec *coreplugin = 0;
foreach (ExtensionSystem::PluginSpec *spec, plugins) {
if (spec->name() == QLatin1String(corePluginNameC)) {
coreplugin = spec;
break;
}
}
if (!coreplugin) {
QString nativePaths = QDir::toNativeSeparators(pluginPaths.join(QLatin1String(",")));
const QString reason = QCoreApplication::translate("Application", "Couldn't find 'Core.pluginspec' in %1").arg(nativePaths);
qDebug() << reason;
// return 1;
}
if (coreplugin->hasError()) {
qDebug() << coreplugin->errorString();
// return 1;
}
pluginManager.loadPlugins();
if (coreplugin->hasError()) {
qDebug() << coreplugin->errorString();
// return 1;
}
QString titlePattern = tr("Memory $");
ICore *core = ICore::instance();
EditorManager* manager = EditorManager::instance();
IEditor* editor = manager->openEditorWithContents(Core::Constants::K_DEFAULT_TEXT_EDITOR, &titlePattern);
Гм... У меня ваш код без последних четрех строк отлично работает с QtCreator 1.2.1. На какой строчке у вас падает?
pluginManager.loadPlugins();
Да, не получается у него стиль загрузить. Просто QtCreator запускается? Под какой системой сидите?
Попробуйте вставит вначале программы, после создания QApplication строчку:
qDebug() << qApp->style()->objectName();
qDebug() << qApp->style()->objectName();
QWindowsStyle* windowsStyle = new QWindowsStyle;
windowsStyle->setObjectName("windows");
QApplication::setStyle(windowsStyle)
Стиль лучше устанавливать через фабрику:
QStyle *pStyle = QStyleFactory::create("windows");//Cleanlooks Plastique windowsxp
if (pStyle){
QApplication::setStyle(pStyle);
qApp->setPalette(pStyle->standardPalette());
}
и проверять указатель, т.к. стиля может не существовать на данной конкретной машине
Litkevich Yuriy
Да, так действительно лучше. Фабрика сама вызовет setObjectName для объекта стиля.
QWindowsStyle* windowsStyle = new QWindowsStyle;
windowsStyle->setObjectName("windows");
QApplication::setStyle(windowsStyle)
Форум Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)