[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;
}
}