среда, 1 июня 2011 г.

QVariant( String )

В текущей версии Qyoto (ver. 4.5.0.0, 2011-06-01) конструктор класса QVariant(String) имеет баг из-за которого QVariant не поддерживает юникодные строки. Связано это с тем, что внутри managed QVariant вызывается не тот unmanaged конструктор:
QVariant(const char*)
вместо
QVariant(const QString&)
Лечится это довольно просто: создается managed класс, назовем его QVariantQString, наследующий QVariant с единственным конструктором принимающим System.String и вызывающим внутри нужный unmanaged конструктор. Далее везде, где нужно создать QVariant( String ), нужно создавать QVariantQString( String ).
Ниже приведен полный работающий код этого класса:


using System;

namespace Qyoto
{
  [SmokeClass("QVariant")]
  internal class QVariantQString : QVariant
  {
    protected QVariantQString(Type dummy) : base(dummy) {}
    
    protected new void CreateProxy()
    {
      interceptor = new SmokeInvocation(typeof(QVariantQString), this);
    }
    
    public QVariantQString(string str) : this((Type) null)
    {
      CreateProxy();
      interceptor.Invoke("QVariant$", "QVariant(const QString&)", typeof(void), typeof(string), str);
    }
  } //class
} //namespace




* This source code was highlighted with Source Code Highlighter.

Комментариев нет:

Отправить комментарий