crossplatform.ru

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

История благодарностей участнику igor_bogomolov ::: Спасибо сказали: 235 раз(а)
Дата поста: В теме: За сообщение: Спасибо сказали:
18.12.2009, 13:43 Qt порт для Native Client
Мортен Сорвиг (Morten Sorvig) из компании Nokia сообщил об успешном опыте портирования библиотеки Qt для работы под управлением фреймворка Google Native Client и запуске первых тестовых qt-виджетов в окне web-браузера....

Продолжение здесь
Главная ссылка к новости (http://labs.trolltech.com/blogs/2009/12/17/take-it-with-a-grain-of-salt/)
Litkevich Yuriy,
5.10.2009, 22:41 Сообщить об ошибке в переводе
http://doc.crossplatform.ru/qt/4.5.0/qmake...oject-templates
Описания app и lib одинаковые.
Мелочь, конечно, но все же
Цитата(оригинал)
app (default) Creates a Makefile to build an application.
lib Creates a Makefile to build a library.

Цитата
app (default) Создает файл сборки для компоновки библиотеки.
lib Создает файл сборки для компоновки библиотеки.




Litkevich Yuriy,
23.9.2009, 23:40 Анимация поверх картинки
Если тебе не нужно рисовать поверх нескольких виджетов одновременно, а только поверх лейбла, задача сильно упрощается. Никакой childRecursive тебе не нужен (прочитай еще раз внимательно статью по ссылке выше).

Создай собственный виджет, примерно так
.h
#ifndef FORM_H
#define FORM_H

#include <QtGui/QLabel>

class MyLabel : public QLabel
{
    Q_OBJECT
    Q_DISABLE_COPY(MyLabel);
public:
    MyLabel(QWidget *parent = 0);
protected:
    bool eventFilter(QObject *obj, QEvent *event);
private slots:
    void myslot2(int frame);
private:
    QMovie* movie;
    QImage image;
};

#endif // FORM_H
.cpp
#include <QtGui>
#include "form.h"

#include <QtDebug>

MyLabel::MyLabel(QWidget *parent) : QLabel(parent)
{
    setPixmap(QPixmap("logo.gif"));
    setScaledContents(true);

    setAutoFillBackground(false);
    installEventFilter(this);

    movie = new QMovie("post.gif", "gif", this);
    connect(movie, SIGNAL(frameChanged(int)), this, SLOT(myslot2(int)));

    movie->start();
}

bool MyLabel::eventFilter(QObject *obj, QEvent *event)
{
    if( (event->type() == QEvent::Paint) && (obj == this) ) {
        removeEventFilter(this);
        QApplication::sendEvent(obj, event);
        installEventFilter(this);

        QPainter p(qobject_cast<QWidget*>(obj));
        p.drawImage(rect().center() - movie->frameRect().bottomRight(), image);
        return true;
    }
    return false;
}

void MyLabel::myslot2(int)
{
    image = movie->currentImage();
    update();
}
main.cpp
#include <QtGui/QApplication>
#include "form.h"

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MyLabel frm;
    frm.show();
    return a.exec();
}
и используй его в своем приложении. (post.gif - это твоя gif)...

Прикрепляю рабочий примерчик, дальше сам для себя допилишь )))
Elfinit,
16.8.2009, 10:26 BRE
С прошедшим!!!
Удачи во всем, всегда хорошего настроения, здоровья богатырского.
:drinks: :)
BRE,
30.7.2009, 17:02 Аналог Q_PROPERTY
Вот что в результате получилось.
инклюдники и определения
#include <map>
#include <string>
#include <boost/function.hpp>
#include <boost/bind/bind.hpp>
#include <boost/variant.hpp>

using namespace std;
using namespace boost;

/// тип свойства
typedef boost::variant<int, string, double> Property_t;

/**
*  \def   REGISTER_PROPERTY(NAME, SETFUNC, GETFUNC)
*  \brief регистрация свойства экземпляра класса.
*
*  \var NAME    - имя свойства
*  \var SETFUNC - указатель на функцию установки свойства
*  \var GETFUNC - указатель на функцию чтения свойства
*/
#define REGISTER_PROPERTY(NAME, SETFUNC, GETFUNC) { \
    register_property( NAME, boost::bind(&SETFUNC, this, _1), boost::bind(&GETFUNC, this) ); \
}
класс Property
class Property
{
public:
    Property() {}       //!< Конструктор
    virtual ~Property() //!< Деструктор. Чистит все списки свойств
    {
        // а как память коректно очистить ???
        propMap.clear();
    }

public:
    /// Тип указателя на процедуру установки свойства
    typedef boost::function< bool (Property_t) > SetFunc;
    /// Тип указателя на процедуру чтения свойства
    typedef boost::function< Property_t ()     > GetFunc;
    /// Тип пары указателей на сетер и гетер
    typedef std::pair< SetFunc, GetFunc        > Set_Get_Pair;
    /// Тип отображения свойств
    typedef std::map< string, Set_Get_Pair     > PropertyMap;

public:
    /**
     *  \brief   Установить свойство.
     *
     *  \var     name  - имя свойства
     *  \var     value - значение
     *  \return  true при успешной установке свойства, иначе false.
     *  \warning Если свойство не найдено, генерируется исключение
     */
    bool setProperty(const char* name, Property_t value)
    {
        std::string str(name);
        PropertyMap::const_iterator i = propMap.find(str);
        if( i == propMap.end() ) {
            throw std::runtime_error("[setProperty] неизвестное свойство");
        }
        return ((i->second).first)(value);
    }

    /**
     *  \brief   Считать свойство.
     *
     *  \var     name - имя свойства
     *  \return  значение свойства
     *  \warning Если свойство не найдено, генерируется исключение
     */
    Property_t property(const char* name) const {
        std::string str(name);
        PropertyMap::const_iterator i = propMap.find(str);
        if( i == propMap.end() ) {
            throw std::runtime_error("[property] неизвестное свойство");
        }
        return ((i->second).second)();
    }

protected:
    PropertyMap propMap; //!< отображение свойств

    /**
     *  \brief Зарегистрировать свойство.
     *  \return true при удачной регистрации, иначе false
     */
    bool register_property(const char* name, SetFunc setprop, GetFunc getprop) {
        return propMap.insert(std::make_pair(string(name), Set_Get_Pair(setprop, getprop))).second;
    }
};
объявление классов для тестирования
class Test1 : public Property
{
public:
    Test1() {
        REGISTER_PROPERTY("Test", Test1::setTestProp, Test1::getTestProp);
    }
    bool setTestProp(Property_t /*val*/) {
        return true;
    }
    Property_t getTestProp() {
        return 125;
    }
};

class Test2 : public Property
{
public:
    Test2() {
        REGISTER_PROPERTY("Test", Test2::setTestProp2, Test2::getTestProp2);
    }
    bool setTestProp2(Property_t /*val*/) {
        return true;
    }
    Property_t getTestProp2() {
        return "string";
    }
};

class Test3 : public Property
{
public:
    Test3() {
        REGISTER_PROPERTY("Test", Test3::setTestProp3, Test3::getTestProp3);
    }
    bool setTestProp3(Property_t /*val*/) {
        return true;
    }
    Property_t getTestProp3() {
        return 1.89;
    }
};
main
int main(int /*argc*/, char** /*argc*/)
{
    Property* b[] = { new Test1, new Test2,  new Test3 };
    for(int i = 0; i != 3; i++ )
        cout <<"Property_t = " << b[i]->property("Test") << std::endl;

    return EXIT_SUCCESS;
}
результат
Цитата
Property_t = 125
Property_t = string
Property_t = 1.89


Для чего это нужно, думаю и так понятно. Что бы имея указатель только на базовый класс, получить доступ к любому методу порожденного от него класса.

У меня еще остался вопрос, по поводу очистки памяти в деструкторе. Достаточно ли просто сделать propMap.clear(); ???
AD,
22.6.2009, 13:31 Непонимаю!
Настройки не совсем одинаковые. У меня
Цитата
port->setFlowControl(FLOW_HARDWARE);
При больших скоростях, лучше пользоваться этой настройкой.

Цитата(posi4 @ 22.6.2009, 14:21) *
получаю на другом конце 20 байт! Как такое может быть?
Запросто. В буфере уже есть какой то мусор. Поэтому при создании порта я делаю
Цитата
port->readAll();
, чтобы очистить буфер. Смотри еще раз мой код.

P.S. Я для отладки делал себе перемычку.
P.P.S. Когда сомневаешmся всегда есть возможность посмотреть прием\передачу через терминал.
posi4,
22.6.2009, 12:27 Непонимаю!
Цитата(AD @ 22.6.2009, 13:19) *
Извините, что вмешиваюсь. А где вы взяли QextSerialPort? В документации по Qt 4.3.2 я его не нашел, потому работаю напрямую с Windows-средствами...
QextSerialPort
Это сторонняя библиотека.


Для тех кто использюет WinAPI, для работы с портом, предлогаю ссылочку. Лучшее что я смог найти по теме
http://www.book-ua.org/FILES/electrotech/2...electr01813.pdf
AD,
17.6.2009, 11:30 остаток времени в QTime
Цитата(AD @ 17.6.2009, 10:29) *
Это насколько я попытался сделать не совсем то, что мне нужно! Время должно передаваться раз в секунду (ну как секундомер, часы....). А вот выполняться действие уже раз в минуту. Подскажите, пожалуйста! Что-то действительно не получается. Не знаю, как исправить....
Высылай сигнал раз в секунду. А в обработчике, создай счетчик прореживания. Как счетчик станет равным 60, выполняй нужное действие.

Это ты имел в виду? :)
AD,
17.6.2009, 0:04 Qt Creator
Цитата(yaroslav429 @ 17.6.2009, 0:49) *
Немного внимательней надо быть))
Может ты немного невнимательный, или лень по директориям полазить.

Скажем так. Путь по умолчанию, куда ставится Qt C:\Qt\2009.02

C:\Qt\2009.02\bin
C:\Qt\2009.02\qt\bin

Найди разницу ;)

Нужные тебе библиотеки в C:\Qt\2009.02\qt\bin

Цитата
Мне бы статическую линковку)
Читать здесь
yaroslav429,
16.6.2009, 11:47 [qt 4.5.1 win32] Метаданные изображений
Цитата(Elfinit @ 16.6.2009, 12:15) *
C:/msys/z/dev/exiv2/lib//libexiv2.a(XMPUtils.o)(.text+0x1a64):XMPUtils.cpp: undefined reference to `__strtod'
Скорее всего не подцепил expat. В любом случае пример который я привел выше, полностью рабочий. Нужно только поменять пути к библиотекам, но это думаю и так понятно.

Цитата(Elfinit @ 16.6.2009, 12:15) *
И ещё, для чего флаг --disable-shared, мне б желательно всё-таки exiv2 в виде dll собрать..
Сейчас уже не помню. Была какая то проблема со сборкой dll. Нужно править configure. В инете находил, что именно нужно сделать.
Elfinit,
11.6.2009, 13:00 12 июня - что за праздник?
Цитата
День России
День России (День независимости России) - это один из самых "молодых" государственных праздников в нашей стране, который отмечается с 1994 года.

12 июня 1990 года на Первом съезде народных депутатов РСФСР была принята Декларация о государственном суверенитете России. От этой даты можно вести отсчет начала становления новой российской государственности, основанной на принципах конституционного федерализма, равноправия и партнерства.

Указом Президента РФ Б.Н.Ельцина от 2 июня 1994 года день принятия Декларации о государственном суверенитете Российской Федерации - 12 июня - объявлен государственным праздником России. По Указу Президента РФ от 16 июня 1998 года он называется "День России". В 2002 году был принят новый Трудовой кодекс РФ, в котором название праздника - "День России" - было закреплено официально.
AD,
8.6.2009, 22:34 sleep в main'е
kwisp, пошукал я исходники на придмет использования qWait и qSleep.

qWait используется в
\src\3rdparty\webkit\WebKit\qt\tests\qwebframe\tst_qwebframe.cpp
\src\3rdparty\webkit\WebKit\qt\tests\qwebpage\tst_qwebpage.cpp
и только по своему прямому назначению, т.е. при написании тестов приложения
реализация QTest::qWait
namespace QTest
{
    inline static void qWait(int ms)
    {
        Q_ASSERT(QCoreApplication::instance());

        QTime timer;
        timer.start();
        do {
            QCoreApplication::processEvents(QEventLoop::AllEvents, ms);
            QTest::qSleep(10);
        } while (timer.elapsed() < ms);
    }
}

qSleep, кроме выше приведенной реализации, больше нигде не используется
реализация QTest::qSleep
void QTest::qSleep(int ms)
{
    QTEST_ASSERT(ms > 0);

#ifdef Q_OS_WIN
    Sleep(uint(ms));
#else
    struct timespec ts = { ms / 1000, (ms % 1000) * 1000 * 1000 };
    nanosleep(&ts, NULL);
#endif
}


Т.ч. можно дернуть код из этих методов. Или использовать структуру, которую привел чуть выше.
:)
flankerr,
8.6.2009, 16:59 sleep в main'е
Цитата(flankerr @ 8.6.2009, 17:43) *
sleep етсь только у QThread.
Наверное, имелось в виду, Sleep из windows.h
Цитата(flankerr @ 8.6.2009, 17:43) *
Т.е. в main его юзать низя - нету там QThread.
А что мешает сделать так
#include <QtGui/QApplication>
#include <QtGui/QDialog>
#include <QtCore/QThread>

struct MSleep : public QThread {
    static void pause(unsigned long msecs) {
        msleep(msecs);
    }
};

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    QDialog dlg;

    MSleep::pause(3000);

    dlg.show();
    return a.exec();
}
;)
flankerr,
5.6.2009, 13:00 Приостановка потока
Вот простенький пример, как приостановить поток при помощи QMutex & QWaitCondition.

mythread.h
#ifndef DIALOG_H
#define DIALOG_H

#include <QThread>
#include <QMutex>
#include <QWaitCondition>

class myThread : public QThread
{
    Q_OBJECT

    bool pause;
    QMutex mutex;
    QWaitCondition cond;

public:
    myThread(QObject *parent = 0);
    ~myThread();

protected:
    void run();

private slots:
    void togglePaused();
};

#endif // DIALOG_H
mythread.cpp
#include "mythread.h"
#include <QtDebug>

myThread::myThread(QObject *parent)
    : QThread(parent), pause(false)
{

}

myThread::~myThread()
{
}

void myThread::togglePaused()
{
    if (pause) {
        cond.wakeOne();
        pause = false;
    } else {
        pause = true;
    }
}

void myThread::run()
{
    const int Timeout = 3 * 100;
    int count = 0;

    forever {
        while(pause) {
            mutex.lock();
            cond.wait(&mutex);
            mutex.unlock();
        }

        qDebug() << count++;
        msleep(Timeout);
    }
}

main.cpp
#include <QtGui>
#include "mythread.h"

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    QDialog dlg;
    QPushButton *pb = new QPushButton("Pause", &dlg);
    QHBoxLayout *hbl = new QHBoxLayout(&dlg);
    hbl->addWidget(pb);
    dlg.setLayout(hbl);

    myThread *thread = new myThread(&dlg);
    QObject::connect(pb, SIGNAL(clicked()), thread, SLOT(togglePaused()));
    thread->start();

    dlg.show();
    return a.exec();
}
.pro
TARGET = pauseThread
TEMPLATE = app
CONFIG += console
SOURCES += main.cpp\
        mythread.cpp
HEADERS  += mythread.h
AD,
4.6.2009, 11:18 Посылка сигнала из дополнительного потока в главный
Цитата(AD @ 4.6.2009, 12:03) *
сигнал определить в дополнительном потоке, а слот создать в главном? Emit делать в слоте главного потока? А коннект в функции run дополнительного? Все так?
Нет.

псевдокод
class HorizontalRotation: public QThread
{
    Q_OBJECT
    int number_rotate;

protected:
    virtual void run();

signals:
    void displayNR(int);
};

void HorizontalRotation::run()
{
    ....
    emit displayNR(number_rotate); \\ где то в потоке
    ...
}


class Form : public QMainWindow, public Ui::MainWindow
{
    Q_OBJECT

    HorizontalRotation horizontalRotation;
    ....
private slots:
    void displayNR(int number);
    ....
}


Form::Form(QWidget *parent) : QMainWindow(parent)
{
    ....
    connect(&horizontalRotation, SIGNAL(displayNR(int)), SLOT(displayNR(int)));
    ....
}
    
void Form::displayNR(int number)
{
     \\ выполняешь необходимые действия
}
AD,
4.6.2009, 11:00 Посылка сигнала из дополнительного потока в главный
Цитата(SABROG @ 4.6.2009, 11:37) *
Правда я не помню, connect вроде бы делать надо в run(), а не в главном потоке. Ну и без exec() в конце run() не обойтись. Может еще поможет QMetaObject::invoke(), чтобы поставить сигнал в очередь насильно.
exec() в данном случае не нужен. Да и коннетк делать там, где создается экземпляр класса HorizontalRotation.

Цитата(SABROG @ 4.6.2009, 11:37) *
Законнектить сигнал из потока со слотом из главного потока как Qt::QueuedConnection. Потом emit этого сигнала с твоим параметром.
Более чем достаточно. Qt::QueuedConnection необязателен, он по идее должен выставиться по умолчанию.
AD,
31.5.2009, 1:38 Разметка QSlider
Цитата(AD @ 29.5.2009, 14:05) *
Так метки вижу. А их пронумеровать-то можно? И соответственно видеть числа на метках?
http://zetcode.com/tutorials/qt4tutorial/customwidget/
Может подойдет или хотя бы поможет
AD,
29.5.2009, 10:09 Разметка QSlider
Цитата(AD @ 29.5.2009, 11:01) *
Еще вопрос такой, как изменить форму ползунка, если это возможно?
Возможно. Смотри примеры из Demo Affine Transformations & Composition Modes
AD,
28.5.2009, 21:15 QPaintEvent, installEventFilter, QPainter, Overpainting
Цитата(Kagami)
igor_bogomolov, выложи, пожалуйста, исходники с мужиком

Выкладываю. Правда координаты где мужика рисую я жестко задавал. Цель была разобраться как работать с гиф анимацией, т.е. считывать кадр из гифки.
Kagami,
28.5.2009, 18:36 Досборка или же пересборка Qt
Цитата(AD @ 28.5.2009, 19:18) *
есть ли прямая функция перевода QString в const char*?
http://www.prog.org.ru/index.php?topic=8930.msg50190 - читай и будь аккуратен с использованием qPrintable
kwisp,
28.5.2009, 12:23 Примитивное рисование в файл
Смотри внимательно описание QPainter. А именно
Цитата
void QPainter::rotate ( qreal angle )

И там далее по ссылкам.

Или используй совместно QMatrix и QPainter
NordWest,
28.5.2009, 11:02 QPaintEvent, installEventFilter, QPainter, Overpainting
Все поправил. Теперь и анимация работает нормально.
Прилагаю изменёный проектик. В нем по таймеру перерисовываются звездочки. Получается как анимация. При нажатии на кнопку рисуется затемненный прозрачный фон.

SABROG
, у меня на работе нет возможности сделать гифку, если нетрудно, скомпилируй проектик, засними, и размести здесь. Что бы вроде как итог подвести. Ну и теперь на самом деле можешь писать статью :rolleyes:
Litkevich Yuriy, SABROG,
28.5.2009, 1:17 QPaintEvent, installEventFilter, QPainter, Overpainting
Цитата(SABROG @ 27.5.2009, 23:05) *
Меня не столько исходники интересуют, сколько скриншот с результатом
??? Какой от него толк, от скриншота?

Исходники прилагаю, скриншот есть. Картинку сам поменяешь, если что. У меня их просто нет.
Litkevich Yuriy,
21.5.2009, 14:15 Задачка - делим торт, поровну
Нужно провести линию через центры обоих прямоугольников. :)

Влад меня опередид, пока я художеством занимался.
AD,
21.5.2009, 13:08 Выделение в таблице представления строки
Цитата
void QTableView::selectRow ( int row ) [slot]

Selects the given row in the table view if the current SelectionMode and SelectionBehavior allows rows to be selected.
AD, u235,

9 страниц V  « < 5 6 7 8 9 >
RSS Текстовая версия Сейчас: 29.3.2024, 13:17