Записки программиста Программирование и не только

28Апр/120

qDebug() и структуры

В дополнении к этому

Есть в классе произвольная структура.
Надо научить её выводиться в qDebug()

Структура:

class MyClass
{
    struct MyStruct
    {
        quint8 a1;
        quint8 a2;
        quint8 a3;
        quint8 a4;
    };
};

Дописываем в *.h :

#ifndef QT_NO_DEBUG_STREAM
QDebug operator<<(QDebug, const MyClass::MyStruct);
#endif

А в *.cpp :

QDebug operator<<(QDebug aDbg, const MyClass::MyStruct strc)
{
    aDbg.nospace() << "( " << "MyStruct" << " ("
                   << strc.a1 << ", "
                   << strc.a2 << ", "
                   << strc.a3 << ", "
                   << strc.a4
                   << ") )";
    return aDbg.space();
}
Метки записи: , , Нет комментариев
20Апр/120

[QtScript] Получить доступ из пользовательской функции к интерфейсу.

Продолжаем извращаться.

Захотелось мне написать свою функцию print для QtScript чтобы вывод шел в QTextEdit.
Класс, который содержит в себе TextEdit у меня зовётся Widget

Функция (Вне классов):

QScriptValue funcPrint(QScriptContext *context, QScriptEngine *engine)
{
    QString result;
    for (int i = 0; i < context->argumentCount(); ++i) {
        if (i > 0)
            result.append(" ");
        result.append(context->argument(i).toString());
    }

    Widget *bgg = (Widget*)engine->parent();
    bgg->print(result);

    return engine->undefinedValue();
}

Регистрируем:

engine->globalObject().setProperty("print", engine->newFunction(funcPrint, 1));

Метод банален:

void Widget::print(QString aStr)
{
    ui->TextEdit->append(aStr);
}

Тонкости:
engine является членом класса Widget (приватным) и инициализируется:

engine = new QScriptEngine(this);

Обязательно указать родителя! Иначе его потом не получить и будет segfault

Соответственно можно объявить engine и не указателем.
Тогда обязательно(!) инициализировать в конструкторе:

Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget),
    engine(this)              //!!!!!
{
    ui->setupUi(this);
    ...
}
Метки записи: , , Нет комментариев
19Апр/123

МСВС и Qt

Понадобилось запустить программу под МСВС3.0 (Kernel 2.4.32, gcc-2.95 и 3.3, Qt 4.4.2)
Сама программа писалась под Qt 4.6.3
Отличия 4.6 от 4.4 достаточно существенны, чтобы программы не компилировалась совсем.
Статическая сборка (собиралось под gcc44 и на ядре 2.6+) работать отказалась, мотивируя отказ фразой "Исключение в операции с плавающей точкой (core dumped)"

Решил задачу так.
Qt 4.6 можно собрать только на gcc4, поэтому скачал gcc-4.2, скомпилировал и поставил.
Скачал qt-4.6.3 (qt-everywhere-opensource-src-4.6.3.tar.gz), распаковал, собрал как статику:
./configure -debug-and-release -static -qt-sql-sqlite -no-qt3support -qt-libtiff -qt-libpng -qt-libjpeg -nomake demos -nomake examples -nomake tools -no-webkit -prefix /opt/qt4.6.3static
Всё успешно собралось и установилось.
Creator удалось поставить вот такой версии - qt-creator-linux-x86-gcc3.3-opensource-1.2.1.bin

Проект с программой успешно собрался, но release версия так работать и не захотела. Segmentation fault и всё тут.
Зато debug версия запустилась на ура.

Перетащил на чистый МСВС - не может найти и загрузить libstdc++.so.6
Утаскиваем и её. Положил рядом с бинарником, сделал симлинк ln -s libstdc++.so.6.0.3 /usr/lib/libstdc++.so.6

Всё завелось и полетело. Решить бы еще проблему с release версией... Но это уже не так страшно.

Метки записи: , 3 Комментарии