Здравствуйте и хорошего вам дня.
Недавно я решил попробовать создать приложения C ++ / Qt4 для платформы symbian (S60 r3), однако у меня возникло несколько проблем, которые я не знаю, как исправить.
Проблемы :
Любое приложение (с дочерними виджетами, такими как QLabel
или QPushButton
). Я пытаюсь сразу же скомпилировать выходы при запуске на мобильном телефоне. Никаких сообщений об ошибках нет, но отладка показала, что в какой-то момент программа выдает QSymbianLeaveException с кодом ошибки KErrAlreadyExists. Все отлично работает в симуляторе или если виджеты скрыты методами hide()
. Примеры Qt SDK компилируются, но не запускаются на мобильном телефоне. Пустой QWidget все еще может отображаться.
Любая попытка визуализировать текст на QWidget
с использованием QPainter::drawText()
приводит к тому, что программа "выходит" аналогичным образом (QSymbianLeaveException с кодом ошибки KErrAlreadyExists (-11)). Это может быть проблемой, которая вызывает # 1. Я все еще могу рисовать линии / круги, используя QPainter
;
Настройка программного / аппаратного обеспечения:
Сотовый телефон: Nokia C5-00 (Symbian S60 r3 FP2, AFAIK)
Версия мобильного телефона Qt Libraries: 4.6.3
Прошивка: 071.005 (04 июня 2011 г.)
ОС ПК: WinXP SP3
Версия QtCreator: 2.0.1
Версия приложения TRK: 3.1.2
Версия TRK API: 3.5
Пример
Следующий код компилируется и прекрасно работает в симуляторе, но не на мобильном телефоне:
файл проекта:
QT += core gui
TARGET = QtSymTest
TEMPLATE = app
SOURCES += main.cpp\
mainwindow.cpp
HEADERS += mainwindow.h
CONFIG += mobility
MOBILITY =
symbian {
TARGET.UID3 = 0xe6e84812
# TARGET.CAPABILITY +=
TARGET.EPOCSTACKSIZE = 0x14000
TARGET.EPOCHEAPSIZE = 0x020000 0x800000
}
main.cpp:
#include <QtGui/QApplication>
#include "mainwindow.h"
int main(int argc, char *argv[]){
QApplication a(argc, argv);
MainWindow w;
#if defined(Q_WS_S60)
w.showMaximized();//application "quits" here
#else
w.show();
#endif
return a.exec();
}
mainwindow.cpp:
#include "mainwindow.h"
#include <QPushButton>
#include <QHBoxLayout>
#include <QLabel>
MainWindow::MainWindow(QWidget *parent)
: QWidget(parent){
QHBoxLayout* layout = new QHBoxLayout();
QPushButton* closeButton = new QPushButton(tr("C&lose"));
layout->addWidget(closeButton);
connect(closeButton, SIGNAL(clicked()), this, SLOT(close()));
setLayout(layout);
}
MainWindow::~MainWindow(){
}
mainwindow.h:
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QtGui/QWidget>
class MainWindow : public QWidget
{
Q_OBJECT
public:
MainWindow(QWidget *parent = 0);
~MainWindow();
};
#endif // MAINWINDOW_H
Выходные данные приложения:
Executable file: 7185 2011-08-29T20:28:12 D:\development\NokiaQtSDK\Symbian\SDK\epoc32\release\gcce\udeb\QtSymTest.exe
Package: 7632 2011-08-29T20:31:44 D:\development\projects\QtSymTest\QtSymTest.sis
Deploying application to 'Nokia C5-00 USB Serial Port (COM6)'...
Copying installation file...
Installing application...
Starting application...
Application running with pid 4958.
Finished.
Результаты отладки:
Согласно моим результатам отладки, приложение выдает QSymbianLeaveException в w.showMaximized()
. Там нет сообщений об ошибках. Если я закомментирую эти строки:
QPushButton* closeButton = new QPushButton(tr("C&lose"));
layout->addWidget(closeButton);`
Программа запустится на мобильном телефоне, и я получу пустой экран с кнопкой «Выход».
Приложение также работает, если я скрываю кнопку , используя closeButton->hide()
, поэтому, очевидно, проблема как-то связана с отображением виджетов.
Если я добавлю paintEvent()
к MainWindow
, это будет работать, пока я не пытаюсь отобразить какой-либо текст. Вызов drawText () приведет к тому, что приложение немедленно сгенерирует QSymbianLeaveException (KErrAlreadyExists):
void MainWindow::paintEvent(QPaintEvent *){
QPainter painter(this);
painter.setRenderHint(QPainter::Antialiasing);
painter.setPen(Qt::red);
int x1 = rect().left(), x2 = rect().right(), y1 = rect().top(), y2 = rect().bottom();
painter.drawLine(x1, y1, x2, y2);
painter.drawLine(x2, y1, x1, y2);
int step = 10;
painter.setPen(Qt::green);
for (int x = 0; x < x2; x += 10)
painter.drawLine(x, y1, x, y2);
for (int y = 0; y < y2; y+= 10)
painter.drawLine(x1, y, x2, y);
painter.setPen(Qt::yellow);
painter.drawEllipse(rect().center(), rect().width()/4, rect().height()/4);
painter.drawText(rect().center(), QString("Test"));//exception is thrown here
painter.end();
}
Попытка создания QFontDatabase также приводит к тому, что приложение выдает такую же ошибку.
Дополнительная информация :
Код ошибки (KErrAlreadyExists) был извлечен следующим образом:
void processError(const std::exception& e){
int errCode = qt_symbian_exception2Error(e);
QString str = QString("%1: %2 , %3").arg(e.what()).arg(errCode).arg(intSize);
QString name = typeid(e).name();
qDebug() << e.what();//nothing gets printed in debugger at this point
qDebug() << typeid(e).name();//but I can see values of str/name in watch window
}
...
try{
painter.drawText(30, 30, "Test");//application quits here
}
catch(std::exception &e){
processError(e);
}
Итак, в чем причина этой проблемы и как ее исправить? Мне наконец-то удалось разобраться в этой проблеме (по крайней мере, теперь у меня есть код ошибки), но я не могу пройтись по реализации Qt в отладчике, поэтому я не уверен, что именно уверен, что именно вызывает эту проблему. Идеи?