Qt4 на Symbian: QSymbianLeaveException (KErrAlreadyExists) во (всех) приложениях с визуализацией текста - PullRequest
3 голосов
/ 29 августа 2011

Здравствуйте и хорошего вам дня.

Недавно я решил попробовать создать приложения C ++ / Qt4 для платформы symbian (S60 r3), однако у меня возникло несколько проблем, которые я не знаю, как исправить.

Проблемы :

  1. Любое приложение (с дочерними виджетами, такими как QLabel или QPushButton). Я пытаюсь сразу же скомпилировать выходы при запуске на мобильном телефоне. Никаких сообщений об ошибках нет, но отладка показала, что в какой-то момент программа выдает QSymbianLeaveException с кодом ошибки KErrAlreadyExists. Все отлично работает в симуляторе или если виджеты скрыты методами hide(). Примеры Qt SDK компилируются, но не запускаются на мобильном телефоне. Пустой QWidget все еще может отображаться.

  2. Любая попытка визуализировать текст на 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.

Результаты отладки:

  1. Согласно моим результатам отладки, приложение выдает QSymbianLeaveException в w.showMaximized(). Там нет сообщений об ошибках. Если я закомментирую эти строки:

    QPushButton* closeButton = new QPushButton(tr("C&lose"));
    layout->addWidget(closeButton);`
    

    Программа запустится на мобильном телефоне, и я получу пустой экран с кнопкой «Выход».

  2. Приложение также работает, если я скрываю кнопку , используя closeButton->hide(), поэтому, очевидно, проблема как-то связана с отображением виджетов.

  3. Если я добавлю 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();
    }
    
  4. Попытка создания 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 в отладчике, поэтому я не уверен, что именно уверен, что именно вызывает эту проблему. Идеи?

1 Ответ

3 голосов
/ 30 августа 2011

Оказывается, я установил пользовательский шрифт (переопределенный системный шрифт по умолчанию) на карту памяти и совершенно забыл об этом, и несколько проблем связанный со шрифтами и пользовательскими шрифтами в Qt 4.6.2 на symbian.Убрал кастомный шрифт и перезагрузил телефон, теперь все работает отлично.Как я и подозревал, это была проблема конфигурации.

...