Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: QScintilla
Форум на CrossPlatform.RU > Библиотеки > Qt > Qt GUI
edwardoid
Имхо, каждый чел когда начинает писать GUI-приложения страется написать редактор. По ходу если пишешь на Qt то для нормального редактора в конце приходится использовать QScintilla.
А документация у него совсем никудышная и иерархия классов не оечьн понятна с первого взгляда. Если, вы, господа не против, давайте соберем тут решения на проблемы с которыми сталкиваешься, когда используешь QScintilla.

Проблема: Как модифицировать поведение аутокомплита? Т.е. как привязать появление окошка аутокомплита к какому-то хоткею или связке клавиш?

Я покопался в сырцах библиотеки, нигде ничего "Qt::Key" не нашел. И даже среди функций по названию ни одно вроде не подходило. Если не сложно покопайтесь и вы. Помогите, плз.
void*
Цитата
Имхо, каждый чел когда начинает писать GUI-приложения страется написать редактор. По ходу если пишешь на Qt то для нормального редактора в конце приходится использовать QScintilla.
А документация у него совсем никудышная и иерархия классов не оечьн понятна с первого взгляда. Если, вы, господа не против, давайте соберем тут решения на проблемы с которыми сталкиваешься, когда используешь QScintilla.

идея хорошая, и самое главное может быть востребованной

Цитата
Проблема: Как модифицировать поведение аутокомплита? Т.е. как привязать появление окошка аутокомплита к какому-то хоткею или связке клавиш?

оно?
Цитата
virtual void autoCompleteFromAll ()
virtual void autoCompleteFromAPIs ()
virtual void autoCompleteFromDocument ()

т.к. это слоты, то можно вызывать по нажатию на любую клавишу
Litkevich Yuriy
Цитата(void* @ 24.2.2009, 21:24) *
т.к. это слоты, то можно вызывать по нажатию на любую клавишу
ну да, правильно, ведь редактор наследник QWidget (прямой или косвенный), а каждому виджету можно задать комбинацию корячих клавиш или вовсе связать с ним действие (QAction)
edwardoid
Не понял. Во первых, они виртуальные. Не должен ли я их сам описать? И какая разница между этими функциями?? Которая именно отображает окно аутокомплита?

Например при попытке :
showAutoComplete = new QAction(this);
    showAutoComplete->setShortcut(QKeySequence(Qt::CTRL + Qt::Key_Space));
    connect(showAutoComplete,SIGNAL(tiggered()),this,SLOT(autoCompleteFromAll()));    

}


showAutoComplet переменная типа QAction*.
Ничего не происходит.

UPD.
Перепробовал все сигналы от QAction, ничего не помогает ;(
void*
Цитата
Не понял. Во первых, они виртуальные. Не должен ли я их сам описать?

это лишь для возможности самому полностью переписать эти функции, если возникнет такая надобность. Можешь не обращать на это внимания.
Цитата
И какая разница между этими функциями?? Которая именно отображает окно аутокомплита?

Информация для автокомплита получается двумя способами. Первый - из так называемых API-файлов, т.е. предварительно составленных файлов со списком всех функций, макросов и т.п. Второй - берется во время выполнения программы из текущего текста QsciScintilla. Слот autoCompleteFromAll() получает информацию для автокомплита из обоих источников, т.е. лучше используй его.
Цитата
Например при попытке :
...
Ничего не происходит.

QAction здесь не причем. Во-первых у тебя опечатка здесь, сигнал называется triggered(), а не tiggered()
connect(showAutoComplete,SIGNAL(tiggered()),this,SLOT(autoCompleteFromAll()));

Во-вторых вот так у меня работает(хотя в твоем примере тоже должно работать, исправь только опечатку):
connect(new QShortcut(Qt::CTRL + Qt::Key_Space, this), SIGNAL(activated()), this, SLOT(autoCompleteFromAll()));


П.С. Если интересно, то вот примерно так загружаются API-файлы в моей IDE:
void TabWidget::loadAllAPIs() {
   QDir dir(QApplication::applicationDirPath());
   dir.cd("apis");
   QStringList lst = dir.entryList(QDir::Files);
   foreach(QString api_path, lst) {
      if(api_path!="." && api_path!="..") {
         api->load(dir.absolutePath() + "/" + api_path); //api - объект класса QsciAPIs
      }
   api->prepare();


А на реально используемые примеры API-файлов можешь взглянуть здесь.
edwardoid
твой код у меня скомпилился, но никак не реагирует на мои нажатия.... хотя есть, что комплитить.
void*
Значит нет информации для автокомплита. Я проверил у себя в программе этот код и он работает. Но когда нечего показывать для автокомплита, то он ничего не отображает

Кстати ты случайно не забыл написать чтобы при создании редактора выполнялось это:
editor->setAutoCompletionSource(QsciScintilla::AcsAll); //по умолчанию стоит равным AcsNone, т.е. автокомплит отключен

?
edwardoid
this->setAutoCompletionSource(QsciScintilla::AcsAll);

У меня тоже было, но что-то не пашет. Даже когда в ауто комплите есть что показывать.


// Кстати как здесь http://www.forum.crossplatform.ru/index.ph...ost&p=15279
ты привязал api к QsciScintilla??? Я так понял, api это переменаня типа QsciAbstractAPIs??
AD
Цитата(edwardoid @ 25.2.2009, 12:27) *
CODE
this->setAutoCompletionSource(QsciScintilla::AcsAll);

У меня тоже было, но что-то не пашет. Даже когда в ауто комплите есть что показывать.

Бррр!

edwardoid, прошу Вас, для таких малых кусков кода используйте тег code. А для больших кусков сочетание code and expand
edwardoid
void* есть идеи?
void*
Цитата(edwardoid @ 25.2.2009, 11:27) *
ты привязал api к QsciScintilla??? Я так понял, api это переменаня типа QsciAbstractAPIs??

да, api - объект класса QsciAPIs. QsciAPIs - это класс, содержащий информацию для автокомплита, почитай внимательнее документацию по этому классу. Достаточно иметь только один объект этого класса, т.к. он shared. Нужно просто загрузить в него инфу из файлов и сделать QsciAPIs::prepare(), и для каждого используемого лексера установить эти API с помощью QsciLexer::setAPIs().

П.С.
Цитата(official documentation)
The QsciAPIs class represents the textual API information used in call tips and for auto-completion. API information is specific to a particular language lexer but can be shared by multiple instances of the lexer.

Raw API information is read from one or more files. Each API function is described by a single line of text comprising the function's name, followed by the function's optional comma separated parameters enclosed in parenthesis, and finally followed by optional explanatory text.

A function name may be followed by a `?' and a number. The number is used by auto-completion to display a registered QPixmap with the function name.

All function names are used by auto-completion, but only those that include function parameters are used in call tips.

QScintilla only deals with prepared API information and not the raw information described above. This is done so that large APIs can be handled while still being responsive to user input. The conversion of raw information to prepared information is time consuming (think tens of seconds) and implemented in a separate thread. Processed information can be quickly saved to and loaded from files. Such files are portable between different architectures.

QScintilla based applications that want to support large APIs would normally provide the user with the ability to specify a set of, possibly project specific, raw API files and convert them to prepared files that are loaded quickly when the application is invoked.
edwardoid
скомпилилось, но выдает ошибку Segmentation Fault:
Структура файлов вроде нормальная, в папке с прогой папка "apis" где файлы скаченные у тебя: c.api и cpp.api.
Но скотина все равно ругаеццо...
void*
у тебя SDI или MDI-приложение? Если MDI, то придется пойти на некоторый изврат, т.к. существует одна проблемка. Если же SDI - то все должно работать нормально, приведи лучше тогда код и строчку где именно вылетает.
edwardoid
приложение MDI
void EEdit::loadApi()
{

    QDir dir(QApplication::applicationDirPath());
    dir.cd("apis");
    QStringList lst = dir.entryList();
    foreach(QString api_path, lst) {
        qDebug(api_path.toStdString().c_str());
        if(api_path!="." && api_path!="..") {
            api->load(dir.absolutePath() + "/" + api_path);
        }
    }";    
    api->prepare();
}


qDebug выдает:
.
..
c.api
--------------------------------
Ошибка возникает в теле foreach
void*
хм... вроде все правильно. Попробуй еще так:
void EEdit::loadApi()
{

    QDir dir(QApplication::applicationDirPath());
    dir.cd("apis");
    QStringList lst = dir.entryList(QDir::Files | QDir::NoDotAndDotDot);
    foreach(QString api_path, lst) {
        qDebug(api_path.toStdString().c_str());
        if(api_path!="." && api_path!="..") {
            api->load(dir.absolutePath() + "/" + api_path);
        }
    }";    
    api->prepare();
}
edwardoid
один хрен. только на аутпуте:
c.api
void*
Тогда у меня варианты закончились. Попробуй определить конкретно строчку на которой прога падает, может что-нибудь еще станет понятнее
edwardoid
вся проблемя в этой строке:
api->load(dir.absolutePath() + "/" + api_path);
void*
замени:
        if(api_path!="." && api_path!="..") {
            api->load(dir.absolutePath() + "/" + api_path);
        }

на
        if(api_path!="." && api_path!="..") {
            qDebug() << (dir.absolutePath() + "/" + api_path);
            api->load(dir.absolutePath() + "/" + api_path);
        }

и посмотри что выведет.
edwardoid
непонятно... он даже не скомпилился...

Компилил KDevelop+gcc
-----------------
cd '/home/edward/Shushi' && LC_MESSAGES="C" LC_CTYPE="C" make -k
compiling eedit.cpp (g++)
eedit.cpp:147: error: invalid use of incomplete type 'struct QDebug'
/usr/include/qt4/QtCore/qglobal.h:1403: error: forward declaration of 'struct QDebug'
/usr/include/qt4/QtCore/qglobal.h:1406: warning: inline function 'QDebug qDebug()' used but never defined
*** Exited with status: 2 ***
-----------------
void*
добавь #include <QtDebug>
molchanoviv
Я за время перерыва уже подзабыл, но разве не QDebug
edwardoid
Output:

/home/edward/Shushi/UnitedEditor
/home/edward/Shushi/apis/c.api
Segmentation fault
*** Exited with status: 139 ***

не понимаю.
Segmentation fault - может с моим c.api проблемы? Но с другой стороны файл я качал у тебя, а у тебя работает...
void*
Цитата(molchanoviv @ 27.2.2009, 13:09) *
Я за время перерыва уже подзабыл, но разве не QDebug

нет, именно QtDebug

Цитата(edwardoid @ 27.2.2009, 13:18) *
/home/edward/Shushi/UnitedEditor
/home/edward/Shushi/apis/c.api

странно, а почему еще происходит попытка загрузить какой-то UnitedEditor(файл или папку) ?
запости под спойлером содержимое c.api
edwardoid
/home/edward/Shushi/UnitedEditor
сорри, это не аутпут QDebug
файл у меня такой же как у тебя: http://trac.assembla.com/Free_DevStudio/br....api?format=raw
void*
но у меня он почему-то нормально работает...
прикрепи чтоли исходники, у меня уже нет вариантов, трудно сказать где может быть ошибка
edwardoid
http://ifolder.ru/10789660 eedit.h + edit.cpp + apis
void*
1) Т.к приложение у тебя MDI, то возможно что проблема вовсе не в API для автокомплита. Кстати без них у тебя редактор нормально работает?
Есть одна бага в самой либе - если свой класс редактора тупо наследовать от QsciScintilla, то в MDI-приложении будут вылеты. Обойти эту проблему можно наследовав класс редактора от QFrame(см. у меня в проекте) и там уже устанавливать QsciScintilla на весь фрейм
2) Просмотрел твои исходники. Я вообще делал немного по другому - объект класса QsciAPIs хранится в табвиджете(где располагаются во вкладках все редакторы) и уже при добавлении нового редактора ему сразу устанавливаются API, т.е. отпадает необходимость хранить в каждом редакторе указатель на QsciAPIs. Можешь попробовать сделать наподобие
edwardoid
Цитата(void* @ 25.2.2009, 0:14) *
Во-вторых вот так у меня работает(хотя в твоем примере тоже должно работать, исправь только опечатку):
connect(new QShortcut(Qt::CTRL + Qt::Key_Space, this), SIGNAL(activated()), this, SLOT(autoCompleteFromAll()));


Можешь показать кусок кода где находятся эти строки? Никак не смог это прикрутить. компилит - не выдает аутокомплита, хотя все есть, т.е. когда пишу напимет "ato" он уже мне atoi подсказывает.
edwardoid
Такая проблема:
QsciScintilla помещен в QWidget
когда я допустим пишу in мне предлагается варианты для аутокомплита, но когда я пытаюсь набрать дальше t:
1) не исчезает аутокомплитчик
2) не in не превращается в int

Чтобы продолжить дальше пеюатаь приходится кликать/выбирать что-то из аутокомплита и так до следующеко слова, которое он может заутокомплитить.
Почему? ВЫ можете мне объяснить?
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Форум IP.Board © 2001-2024 IPS, Inc.