[Qt] UTF в 1251 и 1251 в UTF
На входе имеем строку в HEX виде, да еще и в кодировке CP-1251. Надо Переделать её в UTF-8
Я использовал для этого QTextCodec.
QByteArray msg = QByteArray::fromHex("cde5eff0e0e2e8ebfcedeee520f1eeeee1f9e5ede8e5204b4f4e5f544d5f484f53544b4e4620eef220d3cad2d121"); QTextCodec *codec = QTextCodec::codecForName("Windows-1251"); QString strf = codec->toUnicode(msg); qDebug() << strf;
Переварили строчку и надо отправить её обратно, но на выходе нужен CP-1251
Процедура обратная.
QByteArray wtf_s(strf.toStdString().c_str()); //либо так //wtf_s.append(strf); //либо так QByteArray wtf = codec->fromUnicode(wtf_s); qDebug() << wtf.toHex();
Ключевые слова: Qt, UTFtoCP1251, CP1251toUTF
[Android] Поворот экрана
Варианта управления экраном три:
1. Запретить поворот экрана
В раздел activity
вписать
android:screenOrientation="portrait"
или
android:screenOrientation="landscape"
2. Обрабатываем поворот вручную
Т.к. метод onCreate()
вызывается не только при создании Activity
, но и при повороте экрана, можно отловить данные события.
Подробно можно почитать тут - http://developer.android.com/guide/topics/resources/runtime-changes.html (Кстати, там, возможно, опечатка)
Коротко:
Добавляем в класс Activity
метод:
@Override public Object onRetainNonConfigurationInstance() { final MyDataObject data = collectMyLoadedData(); return data; }
В котором производим сборку всех данных, которые нужно будет снова показать после поворота.
И в метод onCreate
добавляем конструкцию:
final MyDataObject data = (MyDataObject) getLastNonConfigurationInstance(); if (data != null) { loadMyData(); }
В которой данные распаковываем обратно.
3. Запрет автоматического пересоздания Activity
В AndroidManifest.xml
дописать в раздел activity
android:configChanges="orientation|keyboardHidden"
Метод не рекомендуемый, т.к. в сложных приложениях придется самостоятельно обновлять данные внутри программы.
Подробнее можно тут: http://stackoverflow.com/questions/7818717/why-not-use-always-androidconfigchanges-keyboardhiddenorientation
Ну или в официальной доке.
[Android] Первое приложение
Программа будет простенькой.
По нажатию кнопки будет выводится одна из 4 фраз, выбранная случайно, в случайную же область экрана.
ОС: 2.2.2
Сделаем также иконку приложения.
Разрабатывать будем в IntelliJ IDEA
Еще немного о классах
Класс - это упрощенное описание каких-нибудь реальных (чаще, правда, выдуманных) вещей.
Вот, например, точка. Единственное, что есть у точки - это её координаты в пространстве. Это её параметры.
Как задать точку на плоскости? Надо нарисовать точку и подписать её: M(1,2), т.е. точка с именем M и координатами х = 1, у = 2.
Это её "конструктор". Т.е. мы "сконструировали" конкретную точку М с конкретными координатами.
На языке Java это будет выглядеть так:
class Point { //общее описание точек private double x, y; //параметры точки Point(double ax, double ay) { //конструктор x = ax; y = ay; } }
Сконструируем точку
Point M = new Point(1, 2);
В данном классе задан один конкретный конструктор. Из-за этого каждая создаваемая точка будет ожидать, что при создании ей назначат координаты.
Т.е. данная строчка работать не будет:
Point M = new Point(); //пустые параметры //или Point M = new Point(1); //неполные параметры
Дальше. Класс включает в себя не только параметры, но и методы.
Что такое метод класса? Это вопрос, который мы можем задать или указание, что-либо сделать. Причем и вопрос и указания нужно адресовать уже конкретной сконструированной точке.
Научим точку сообщать свои координаты и перемещаться по одной из координатных осей:
class Point { //общее описание точек private double x, y; //параметры точки Point(double ax, double ay) { //конструктор x = ax; y = ay; } //запрос координаты Х double getX() { return x; } //запрос координаты Y double getY() { return y; } //указание сдвинуться по оси X на расстояние dx void moveX(double dx) { x = x + dx; } //указание сдвинуться по оси Y на расстояние dy void moveY(double dy) { y = y + dy; } } //использование public class Main { public static void main(String[] args) { //создаём точку Point M = new Point(1, 2); //спрашиваем у созданной точки - скажи нам, точка М свои координаты X и Y System.out.println("Текущие координаты точки М: x = " + M.getX() + ", у = " + M.getY()); System.out.println("Сдвинем точку по оси Х на 5 и по оси У на -1"); //просим точку М - точка М, сдвинься на 5 по оси X M.moveX(5); //просим точку М - точка М, сдвинься на -1 по оси Y M.moveY(-1); //спрашиваем у точки М - скажи нам, точка М свои координаты X и Y System.out.println("Новые координаты точки М: x = " + M.getX() + ", у = " + M.getY()); } }
Еще раз повторю - методы вызываются у конкретной точки - сконструированного объекта.
Класс - это просто заготовка, шаблон, описание.
Т.е. пока точка не создана - мы как бы задумываем её нарисовать.
А вот когда сказали new, это значит, что мы нарисовали конкретную точку в конкретном месте координатной плоскости.
Записи вида
Point.getX(); //или Point.moveX(5);
Не имеют смысла, потому что описание ничего не знает.
Это как если спросить у человека - "скажи мне координаты точки?"
Логично будет подумать, что он ответит - "какой именно?"
Также делает и компилятор.
[Java] this, super
1. Как-то я писал, что не понимаю, зачем вызывать конструктор в конструкторе через this.
Разобрался.
Это для укорачивания кода.
Типа можно так:
class Point { int х, у; Point(int х, int у) { this.x = х; this.у = у; } Point() { this.x = -1; this.у = -1; } }
А можно короче:
class Point { int х, у; Point(int х, int у) { this.x = х; this.у = у; } Point() { this(-1, -1); //конструктор вызывает другой конструктор } }
Есть одно ограничение на вызов одного конструктора из другого. Такой вызов должен быть первым оператором в вызывающем конструкторе.
2. super
Данная функция служит для вызова конструктора базового класса. Используется, если базовый класс, например, не имеет конструктора по умолчанию
Пример
class X { X(int a) { ... } ... } class Y extends X { Y() { super(0); ... } ... }
Также super может использоваться и для явного вызова методов базового класса. Это необходимо, если некоторый метод базового класса был переопределен в порожденном классе.
Пример
class Base { int x = 1; long y; Base(long y) { this.y = y; } Base() { this(0); // вызов конструктора Base(long y) } public long f() { return x*y; } } class Derived extends Base { String name = ""; Derived(String name, long par) { super(par); // вызов конструктора Base(long y) this.name = name; } public long g(int r) { return r+super.f(); // вызов метода f() класса Base } public long f() { x++; return 2*y; } }