[Алгоритмы] MAXimal
Нашел отличный сайт: http://e-maxx.ru/algo/
"Здесь представлено 145 алгоритмов. Ко всем алгоритмам даны краткие описания и программы на C++."
Также на сайте представлено большое количество книг по программированию
[LJ API] getfriends
Спрашиваем список френдов. Возвращает тех, кого вы добавили в друзья.
Метод LJ.XMLRPC.getfriends
Ему необходимо передать логин, пароль и версию протокола.
Пример:
<?xml version="1.0"?> <methodCall> <methodName>LJ.XMLRPC.getfriends</methodName> <params><param><value><struct> <member><name>username</name><value><string>test</string></value></member> <member><name>password</name><value><string>test</string></value></member> <member><name>ver</name><value><int>1</int></value></member> </struct></value></param></params> </methodCall>
Отправляем естественно в одну строку без всяких табуляций и переносов.
В ответ получим defaultpicurl, bgcolor, fgcolor, fullname, username
[Qt] Запись файла в SQLite
Собственно, всё просто
Создали в БД таблицу с атрибутом типа BLOB:
CREATE TABLE fileTable (id_file integer NOT NULL PRIMARY KEY AUTOINCREMENT, file BLOB NOT NULL);
Потом:
QFile file(QApplication::applicationDirPath().append("/file")); file.open(QIODevice::ReadOnly); //открыли файл QByteArray ba = file.readAll(); //прочитали из него всё QSqlQuery query(QSqlDatabase::database("sql")); // query.prepare("INSERT INTO fileTable (file) VALUES(:val);"); //создали запрос query.bindValue ( ":val", ba); query.exec(); //запустили file.close(); //файл закрыли
И всё. Ну, естественно, дописали обработку ошибок.
Обратный процесс - чтение файла из SQLite:
QFile file(QApplication::applicationDirPath().append("/newfile")); file.open(QIODevice::WriteOnly); QSqlQuery query(QSqlDatabase::database("sql")); query.prepare("SELECT file FROM fileTable;"); query.exec(); query.next(); QByteArray ba = query.value(0).toByteArray(); file.write(ba); file.close();
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(); }
[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); ... }
МСВС и 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 версией... Но это уже не так страшно.
[Еще вариант] Отправляем объект из внешней библиотеки в скрипт.
В первом варианте код был жестко завязан на интерфейсный класс плагина.
Как оказалось, можно обойтись и без него.
Для этого надо:
1. В плагине к конструктору добавить служебную конструкцию Q_INVOKABLE. Т.е. должно получиться так:
Q_INVOKABLE explicit ScriptObject(QObject *parent = 0);
А в основной программе нужно убрать строку с приведением qobject_cast и заменить строку с регистрацией объекта в движке на вот такую:
QScriptValue scObj = engine.newQObject(plugin->metaObject()->newInstance(), QScriptEngine::ScriptOwnership);
И всё! Никакой привязки к интерфейсу!
Теперь буду разбираться с тем, как бы всё это безобразие соединять сигналами. Как-нибудь по динамичнее.
upd: Не забываем в после засовывания объекта в скрипт его там зарегистрировать.
engine.globalObject().setProperty("ScObj", scObj);
Отправляем объект из внешней библиотеки в скрипт
В Qt, как известно, есть замечательная вещь как QScript, позволяющая использовать ECMA скрипт.
В данный скриптовый движок возможно запихивать как отдельные функции, так и целые объекты.
А можно ли запихать в движок объект из внешней библиотеки (.dll, .so etc)?
Оказывается, что можно.
const и все-все-все
char greeting[] = “Hello”; char *p = greeting; // неконстантный указатель, // неконстантные данные *p = "Bye"; // можно ++p; // можно
const char *p = greeting; // неконстантный указатель, // константные данные char const *p = greeting; // то же самое *p = "Bye"; // нельзя ++p; // можно
char * const p = greeting; // константный указатель, // неконстантные данные *p = "Bye"; // можно ++p; // нельзя
const char * const p = greeting; // константный указатель, // константные данные *p = "Bye"; // нельзя ++p; // нельзя
Для функций-членов есть еще один модификатор
int foo() const // гарантирует, что функция не модифицирует // содержимое класса
QHash и структура в качестве ключа.
Тема легкая, но мне, почему-то далась достаточно напряжно.
Задача: использовать в качестве ключа QHash структуру.
Читаем документацию - для данной операции достаточно в структуре определить оператор "==" и написать глобальную функцию qHash для нашей структуры.
Решение:
struct MyStruct { quint8 a1; quint8 a2; quint8 a3; quint8 a4; bool operator==(const MyStruct struc) const { return (a1 == struc.a1 && a2 == struc.a2 && a3 == struc.a3 && a4 == struc.a4); } };
uint qHash(const MyStruct &struc) { //как-то вычисляем хеш //в моём случае в структуре содержалось 4 целых числа и я просто записал их в одно число со сдвигом uint result = struc.a1; result <<=(sizeof(quint8)*8); result = result|struc.a2; result <<=(sizeof(quint8)*8); result = result|struc.a3; result <<=(sizeof(quint8)*8); result = result|struc.a4; return result; }
Использование:
QHash < MyStruct, QString > myQHash
Всё работает отлично.
А вот при попытке использовать еще одну структуру в качестве значения QHash
QHash < MyStruct, MyOtherStruct > myOtherQHash
При запросе значения по ключу - всё работает отлично, но при попытке получить ключ по значению получаем надпись:
no match for 'operator==' in 'i.QHash<Key, T>::const_iterator::value [with Key = MyStruct, T = MyOtherStruct]() == avalue'
Страшная надпись, не правда ли? :)
Причина - не хватает операции "==" во второй структуре. Добавляем её и всё работает.
Вот так.
struct, key, qhash