Показаны сообщения с ярлыком Qt. Показать все сообщения
Показаны сообщения с ярлыком Qt. Показать все сообщения

пятница, 8 сентября 2017 г.

AppVeyor и Qt

Вот на первый взгляд у первого всё хорошо со вторым, вроде бы всё поддерживается.
Но нет, то x86 не поддерживается в сборке, то Qt Script почему-то уберут (последнее вообще непонятно, сколько ни ставил, всегда был в сборке)

Сама сборка тоже ведёт себя почему-то странно: то не подгружаются пути, то ещё что-то. Хоть самому делай свои образы и  CI.

суббота, 22 октября 2016 г.

Re: Qt Script not dead

В прошлый раз я написал о том, что по-хорошему, с Qt Script надо бы куда-нибудь мигрировать пока не поздно..

И тут же поймал себя на мысли, что, возможно, я ошибаюсь и  сделать автоматическую привязку слотов и свойств классов Qt в целевом языке займет чрезвычайно много времени, или вообще невозможно без влезания во внутренние структуры Qt, которые недоступны и недокументированы.

С этой целью и решил сделать свою библиотеку и привязать возможность скриптования с использованием Qt через Duktape, как основного движка для JS.

суббота, 15 октября 2016 г.

Когда Q_DECLARE_METATYPE недостаточно

Недавно столкнулся с ситуацией, когда макроса из заголовка оказывается недостаточно для полноценной работы с рефлексией и слотами в Qt.

воскресенье, 7 августа 2016 г.

Qt Script not dead

Есть в Qt такой модуль, который уже с 5-й версии является deprecated и полноценной замены ему, по моему мнению, пока не предвидится. Я говорю, конечно же, о Qt Script и его использовании для реализации скриптов со стороны пользователя .


суббота, 22 ноября 2014 г.

Qt + Ruby, Windows XP

Чтобы Qt в Ruby нормально работало по Windows XP сначала нужно поставить гем qtbindings-qt, а уже потом qtbindings. Иначе придется собирать qtbindings вручную, что, к сожалению, очень часто падает и почти никогда не срабатывает нормально. А еще лучше ставить версию 2.0.0 - она пока на Windows XP работает лучше всего.

понедельник, 30 июня 2014 г.

Qt Palette Color Picker

Нашел хороший пример для приема из предыдущего поста.


вторник, 3 июня 2014 г.

Комплексные виджеты в Qt

В довольно древней книге-туториалу по VB.NET описывалось то, как можно создать свой комплексный виджет, состоящий из нескольких подвиджетов на основе встроенного в систему UserControl.

В туториалах по Qt есть свой туториал по созданию своих сложных виджетов на основе QWidget. Но он довольно сложный, так как рассчитан на интеграцию в Qt Designer. В итоге разработка своего виджета может показаться сложным и неблагодарным занятием. 

Но есть более простой путь. Он заключается в наследовании класса QWidget и переопределении методов void resizeEvent( QResizeEvent * e ), а также void moveEvent( QMoveEvent * e );

При этом достаточно объявить новые виджеты, как поля в новом классе и назначить им родительским виджетом, виджет родительский для данного. В итоге - виджеты будут отображаться и  даже реагировать на действия пользователя.

Мини-пример такого виджета на C++ показан ниже.


#include <QWidget>
#include <QTreeWidget>
#include <QTableWidget>


class MyWidget: public QWidget
{
    Q_OBJECT
public: 
        MyWidget(QWidget * parent = NULL);        
        ~MyWidget();
protected:
        virtual void resizeEvent(QResizeEvent * e);
        virtual void moveEvent(QMoveEvent * e);
        void resizeWidgets(const QRect & r);

        QTreeWidget  * m_tree_view;
        QTableWidget * m_element_view;
};

MyWidget::MyWidget(QWidget * parent) 
: QWidget(parent)
{
        m_tree_view = new QTreeWidget(parent);
        m_element_view = new QTableWidget(parent);

        resizeWidgets(this->geometry());
}

MyWidget::~MyWidget()
{
        delete m_tree_view;
        delete m_element_view;
}

void MyWidget::resizeEvent( QResizeEvent * e )
{
        QRect oldrect = this->geometry();
        QRect r(oldrect.x(), oldrect.y(), e->size().width(), e->size().height());
        resizeWidgets(r);
}

void MyWidget::moveEvent( QMoveEvent * e )
{
        QRect oldrect = this->geometry();       
        QRect r(e->pos().x(), e->pos().y(), oldrect.width(), oldrect.height());
        resizeWidgets(r);       
}

void MyWidget::resizeWidgets(const QRect & r)
{
        double halfsizenopad = r.width() / 2.0;
        m_tree_view->setGeometry(r.x(), r.y(), halfsizenopad, r.height());
        double element_view_x = r.x() + r.width() / 2.0;
        m_element_view->setGeometry(element_view_x, r.y(), 
                                    halfsizenopad , r.height());
}

Код более серьезного виджета на С++, использующего этот же подход можно посмотреть по ссылкам: [1] [2].

UPD: Можно обойтись и без реализации resizeEvent и moveEvent, если использовать один из наследников QLayout, а виджеты добавлять в него. Спасибо degeron!