crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

История благодарностей участнику BRE ::: Спасибо сказали: 264 раз(а)
Дата поста: В теме: За сообщение: Спасибо сказали:
5.10.2009, 10:42 Перевод в символа и строки в двоичный код
        QString str = "a";
        QByteArray arr = str.toAscii();
        qDebug() << arr.size() << arr;

        QString out = QString::number( arr[ 0 ], 2 );
        qDebug() << out;
++Norton++,
4.10.2009, 17:34 Запаковка в dll шаблонных классов
Цитата(niXman @ 4.10.2009, 17:57) *
Проведу эксперимент. Отпишусь.


tree.h
template<class T>
class Tree
{
    ...
};


objectstree.h
#include <tree.h>

class MYMATHSHARED_EXPORT ObjectsTree : public Tree<QObject*>
{
};

Это декларация нового типа (класса), код для него генерироваться не будет.
Для его использования компилятору потребуется сам файл objectstree.h и файл с описание шаблона tree.h, который включается в objectstree.h
А весь код будет разворачиваться в пользовательских файлах, где будет использоваться (создаваться) объект класса ObjectsTree.

А вот если в класс ObjectsTree добавить методы, например appendObject(), removeObject(), тогда эти методы попадут в библиотеку и будут экспортированы. Также там развернутся все необходимые методы шаблона Tree, если будут использоваться.
Elfinit,
3.10.2009, 19:26 QString
Цитата(pelican @ 3.10.2009, 20:20) *
Тогда похожый метод подскажите. Который позволяет скопировать в другой экземпляр QString заданную подстроку или типа того.

У QString куча подобных методов: left(), right(), mid().
И все это описано в превосходной документации... Которую необходимо читать. ;)
pelican,
2.10.2009, 9:20 QT 4.3.0 не найден файл QSystemTrayIcon
Цитата(Cergey @ 2.10.2009, 10:10) *
В общем да. У нас просто правила дурацкие: для вывода использовать консоль. ... если при запуске сервер скрывается в Tray и показывает консольное окно лишь по требованию пользователя +10%;

Можно создать окно на базе QListView, в качестве модели использовать QStringListModel. В эту модель добавляются диагностические строки. Когда пользователь захочет посмотреть диагностику (из меню QSystemTrayIcon), то открывать это окошко.
Если для вывода диагностики на консоль используются qDebug(), qWarning(), есть простой способ сделать такое переопределение.

Цитата(Cergey @ 2.10.2009, 10:17) *
Но когда я пытаюсь показать иконку в трее консоль просто закрывается!!!

Ты бы еще код показал. ;)
Cergey,
2.10.2009, 9:07 QT 4.3.0 не найден файл QSystemTrayIcon
Цитата(Cergey @ 2.10.2009, 10:02) *
В gui переводить(хотя я не знаю как консольку там эмулировать) или может есть что-то уже другое.

BRE, а где переменная QT в pro файле???

Я же написал, если переменная QT в pro файле явно не прописана, то по умолчанию используются две библиотеки: core и gui (все это описано в assistent).

Поясни, что это за сервер, для чего ты используешь консоль? Просто выводишь в ней сообщения?
Что бы перевести приложение в GUI вполне возможно хватит использования QApplication вместо QCoreApplication, переключения вывода сообщений из консоли в окно, и добавления иконки в систем трей.
Cergey,
1.10.2009, 6:52 Смена курсора на виджете
Цитата(Elfinit @ 30.9.2009, 23:26) *
Т.е. при addWidget на самом деле на сцену вешается GraphicsItem?

Да, посмотри что возвращает addWidget:
QGraphicsProxyWidget * QGraphicsScene::addWidget ( QWidget * widget, Qt::WindowFlags wFlags = 0 )

Цитата(Elfinit @ 30.9.2009, 23:26) *
И вообще, зачем ему менять курсор на дефолтный?

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

Как мне кажется, сначала отрабатывает обработчик события перемещения мыши для твоего виджета (там ты меняешь курсор на нужный), а потом отрабатывает этот же обработчик в view (и меняет курсор на тот который задан для элемента и если он не задан, то дефолтный). Посмотри исходники, возможно это можно обойти.
Elfinit,
25.9.2009, 19:47 Корректное удаление виджета
Я чуть выше писал, что нельзя удалять объект из самого себя, для этого как раз подходит deleteLater.
А здесь, не явно, но именно это и происходит.
Из цикла обработки событий вызывается обработчик события таймера для объекта movie, он посылает сигнал frameChanged, это разворачивается в прямой вызов метода myslot2, из которого мы убиваем объект movie.
igor_bogomolov, Litkevich Yuriy,
13.9.2009, 15:10 работа с процессами abra,
8.9.2009, 19:08 QList <internal error>
Цитата(kemiisto @ 8.9.2009, 19:30) *
:help:


В конструкторе и операторе копирования в циклах не нужно вычитать единицу, у тебя же условие <.
Раскрывающийся текст

Render::Molecule::Molecule(const Render::Molecule& chemistryMolecule) :
    atomsList_(chemistryMolecule.atomsList_),
    bondsList_(chemistryMolecule.bondsList_),
    incidenceMatrix_(chemistryMolecule.incidenceMatrix_),
    charge_(chemistryMolecule.charge_)
{
  for (quint16 i = 0; i < atomsCount(); ++i)
  {
    atomsList_[i].molecule_ = this;
  }
  for (quint16 i = 0; i < bondsCount(); ++i)
  {
    bondsList_[i].molecule_ = this;
  }
}

Render::Molecule& Render::Molecule::operator=(const Render::Molecule& molecule)
{
  if (this != &molecule)
  {
    atomsList_ = QList<Render::Atom>(molecule.atomsList_);
    bondsList_ = QList<Render::Bond>(molecule.bondsList_);
    incidenceMatrix_ = IncidenceMatrix(molecule.incidenceMatrix_);
    charge_ = molecule.charge_;
  }
  for (quint16 i = 0; i < atomsCount(); ++i)
  {
    atomsList_[i].molecule_ = this;
  }
  for (quint16 i = 0; i < bondsCount(); ++i)
  {
    bondsList_[i].molecule_ = this;
  }
  return *this;
}

//
// Стоит проверять index на предмет выхода за пределы списка
//

const Render::Atom& Render::Molecule::atom(quint16 index) const
{
  Q_ASSERT( index < atomsList_.size() );
  return atomsList_.at(index);
}

const Render::Bond& Render::Molecule::bond(quint16 index) const
{
  Q_ASSERT( index < boundsList_.size() );
  return bondsList_.at(index);
}

kemiisto,
2.9.2009, 18:28 СИГНАЛ в главном потоке, СЛОТ - в дочернем
Цитата(sploid @ 2.9.2009, 18:24) *
pelican, маленькое замечание, слот вызовется не в созданном потоке, а в главном потоке.

Уточнение: слот будет выполняться в контексте того потока из которого будет вызван. Если будет вызван из run() потока, то выполнится в контексте потока. Если объект наследник от QThread будет перемещен в контекст потока (QObject::moveToThread), то так-же будет выполняться в контексте потока.
pelican,
27.8.2009, 12:50 typeid(*<class>).name()
Похоже что 15 это длина имени класса, а вот кто ее печатает или добавляет к имени пока не смотрел.

Точно, это длина имени класса.
Проверял на gcc (GCC) 4.4.1 20090725 (Red Hat 4.4.1-2).

Причем если в typeid передать указатель на объект, то впереди этой сигнатуры добавляется 'P' (P6Person).
Для стандартных типов длина не указывается, т.е.
int - 'i'
int* - 'Pi'

И вот еще ссылку нашел: http://bytes.com/topic/c/answers/139862-typeinfo
Если используются namespace, то впереди будет идти N<длина имени namespace><имя namespace>.
ЙаМайскЫйПчОЛ,
18.8.2009, 16:56 Остановка потока
Не увидел на что влияет stopped.
Попробуй добавить wait, для того что-бы убедиться что нить завершилась.

/// Загрузка одного файла
bool TLV::loadFile()
{
    bool result = false;
    if(threadRFile -> isRunning())
    {
        threadRFile -> stop();
        threadRFile -> quit();

        threadRFile -> wait();

        delThread();
        result = readFile();
        visible_tracks = true;
    }
    else
    {
                      /// any
    }
    update();
    return result;
}
AD,
11.8.2009, 18:14 Ошибка при работе с boost::any
Цитата(AD @ 11.8.2009, 13:22) *
Об этом подумал. Какой класс буста использовать? :) Как приблизительно это можно реализовать? Спасибо за помощь!!!

Мне понравилось одно решение с фабриками (подсмотрел на Inside C++). Я его немного переделал, что бы в качестве ключа можно было использовать не только строки.
Раскрывающийся текст

template <typename key, class base>
class factory
{
public:

    typedef boost::shared_ptr<base> base_ptr;

    template <class derived>
    void reg( const key& name )
    {
        factories[ name ] = base_type_ptr( new derived_type<derived> );
    }

    base_ptr create( const key& name )
    {
        if( !factories.count( name ) )
            throw std::out_of_range( "factory: key not found" );
        return factories[ name ]->create();
    }

private:

    class base_type
    {
    public:

        virtual ~base_type() {}

        virtual base_ptr create() const = 0;
    };

    typedef boost::shared_ptr<base_type> base_type_ptr;

    template <class T>
    class derived_type : public base_type
    {
    public:

        virtual base_ptr create() const
        {
            return base_ptr( new T );
        }
    };

    typedef std::map<key, base_type_ptr> factory_container;
    factory_container factories;
};



Как это использовать:
Раскрывающийся текст

// Виртуальный базовый класс
class Loader
{
public:
    virtual    bool load() = 0;
};

// Загружает карту земли
class EarthMapLoader : public Loader
{
public:
    virtual    bool load();
};

// Загружает карту моря
class SeaMapLoader : public Loader
{
public:
    virtual    bool load();
};

void func()
{
    typedef factory<int, Loader> LoaderFactory;
    typedef LoaderFactory::base_ptr LoaderPtr;

    LoaderFactory loaders;

    // Регистрируем загрузчики
    loaders.reg<EarthMapLoader>( 0 );
    loaders.reg<SeaMapLoader>( 1 );

    // Использование
    int index = 1;        // index тип карты
    
    // В зависимости от index создаем нужный объект загрузчика
    LoaderPtr loader = loaders.create( index );

    // loader - указывает на объект SeaMapLoader
    // Вызываем метод load
    loader->load();
}

AD,
11.8.2009, 12:17 Ошибка при работе с boost::any
Цитата(AD @ 11.8.2009, 9:26) *
Цитата(BRE @ 10.8.2009, 9:20) *
Примерно так:

Спасибо. А вопрос такой, а можно ли это сделать так, чтобы при добавлении, например, еще какого-то типа данных, ну например топографии другого формата, не надо было бы еще одну ветку else делать? Т.е. смысл-то этого вектора с any, чтобы он автоматом определял тип, а не при непосредственном приведении.

Поэтому я тебе и написал, что не могу понять для чего ты все это делаешь. Теперь понял. ;)

IMHO any не очень подходит для таких задач. Можно попробовать получать имя типа из type_info, но все равно придется городить свой if для каждого типа. При добовлении нового типа, нужно будет дописывать свою ветвь.

Может лучше воспользоваться фабриками. Для каждого типа карты делается специальный класс loader, который умеет ее загружать. Все они регистрируются в фабрике и она создает объект-загрузчик в зависимости от указанного типа.
AD,
10.8.2009, 8:20 Ошибка при работе с boost::any
Цитата(AD @ 10.8.2009, 9:12) *
А как именно поправить я не понял? Прости, если донимаю...

Примерно так:
void CategoriesCharts::initMapEntity(const TabType key, MapEntity& entity)
{
    QFile file(entity.name());
    if(!file.open(QIODevice::ReadOnly)) return;
    qint64 sz = -1;
    std::vector<any> _types;
    fillVectorTypes(_types);
    if( _types[ key ].type() == typeid( DCW_HEAD ) )
        file.read( (char*)&any_cast<DCW_HEAD>( _types[ key ] ), sizeof( any_cast<DCW_HEAD>( _types[key] ) ) );
    else if( _types[ key ].type() == typeid( HEAD ) )
        file.read( (char*)&any_cast<HEAD>( _types[ key ] ), sizeof( any_cast<HEAD>( _types[key] ) ) );
    file.close();
}
AD,
9.8.2009, 19:23 Qt + Bison, ошибки компиляции. решения/предостережения.
Цитата(Litkevich Yuriy @ 9.8.2009, 19:57) *
А что такое Bison?

http://ru.wikipedia.org/wiki/GNU_bison
Litkevich Yuriy,
30.7.2009, 13:50 Аналог Q_PROPERTY
Более подробный рабочий пример:
Раскрывающийся текст

#include <boost/function.hpp>
#include <boost/bind.hpp>
#include <iostream>

class Base
{
public:
    typedef boost::function<bool (int)> SetFunc;
    typedef boost::function<int ()> GetFunc;

    Base() : m_value( 0 ) {}

    bool set( int val )
    {
    std::cout << "set=" << val << std::endl;
    m_value = val;
    return true;
    }

    int get()
    {
    return m_value;
    }

private:
    int    m_value;
};

int main( int, char ** )
{
    Base b;

    Base::SetFunc sf = boost::bind( &Base::set, &b, _1 );
    Base::GetFunc gf = boost::bind( &Base::get, &b );

    std::cout << "get=" << gf() << std::endl;
    sf( 100 );
    std::cout << "get=" << gf() << std::endl;
    
    return 0;
}

igor_bogomolov,
30.7.2009, 12:20 Аналог Q_PROPERTY
Набросаю прямо здесь небольшой пример:
typedef boost::function<bool (int)> SetFunc;
typedef boost::function<int ()> GetFunc;

bool register_property(const char* name, SetFunc setprop, GetFunc getprop)
{
    ...
}
igor_bogomolov,
30.7.2009, 12:01 Аналог Q_PROPERTY
Цитата(igor_bogomolov @ 30.7.2009, 12:54) *
Ничего не получается. Не могу разобраться. Только начал разбираться с boost. Сложен он для меня (((

register_property("TEST",boost::bind(&base1::setTestProp), boost::bind(&base1::getTestProp));

Выдает кучу ошибок. Не пойму как переделать надо?
Поможите, а? )))

Попробуй так:
register_property( "TEST", boost::bind( &base1::setTestProp, this ), boost::bind( &base1::getTestProp, this ) );
igor_bogomolov,
29.7.2009, 16:41 QDrag и перетаскивание из Q*View в Explorer
Экранируй '\' -> '\\'
    mimeData->setUrls(QList<QUrl>() << QUrl::fromLocalFile("C:\\text.txt"));
    drag->setMimeData(mimeData);
Stanislaus,
29.7.2009, 12:43 Char и QString
Цитата(posi4 @ 29.7.2009, 13:40) *
Увидел название темы и решил задать вопрос про char и QString.

Как загнать элемент QString в QDataStream через оператор <<?
Вариантов перегрузки у него куча, но для QString'а нету. Напрашивается
вариант перегрузить его вручную. Может есть уже написанные варианты
или вообще другой способ?

Как это нет, все есть.
QDataStream & operator<< ( QDataStream & stream, const QString & string )ж
posi4,
27.7.2009, 10:17 Перемещение QFrame
Цитата(AD @ 27.7.2009, 11:14) *
Это "почти" состоит в том, что я из координаты вычитаю константу. У меня она равна 20. А есть возможность сделать без таких хаков? Заранее благодарен.

Попробуй вычитать для:
* VLine - width() / 2
* HLine - height() / 2
AD,
23.7.2009, 11:34 Ошибка при вызове сигнала
Убрать const:
bool GraphicDisplay::isViewfinder(const QPoint& pos) const
AD,
23.7.2009, 10:30 Пересечение визира с графиком
Цитата(AD @ 23.7.2009, 11:21) *
Разбор лог-файла. Оттуда считываю данные. По этим данным и строю график. Технология та еще....

У тебя есть коллекция значений Y при определенном X, которые ты соединяешь прямыми?
Формулу прямой знаем, выбираем координаты начала и конца линии из диапазона в котором визир. Подставляем их в формулу и получаем значение Y.
AD,
21.7.2009, 13:37 Определение точных координат на графике в контекстном меню
У нас есть виджет на котором рисуется график.
Его размер в точках - sizeWidget, пусть будет sizeWidget.x = 200, sizeWidget.y = 100.
Есть позиция мыши внутри этого виджета, пусть будет posMouse.x = 180, posMouse.y = 23.
Есть размер системы координат графика sizeGraph, пусть будет sizeGraph.x = 1000, sizeGraph.y = 200.
Что бы получить значение координаты мыши делаем:
point.x = posMouse.x * sizeGraph.x / sizeWidget.y -> point.x = 180 * 1000 / 200 = 900.

График рисуется по формуле y = f(x), подставляем полученное значение по горизонтали и получаем point.y.
AD,

11 страниц V  « < 7 8 9 10 11 >
RSS Текстовая версия Сейчас: 24.4.2024, 5:59