Записки программиста Программирование и не только

20Мар/120

[Еще вариант] Отправляем объект из внешней библиотеки в скрипт.

В первом варианте код был жестко завязан на интерфейсный класс плагина.

Как оказалось, можно обойтись и без него.
Для этого надо:
1. В плагине к конструктору добавить служебную конструкцию Q_INVOKABLE. Т.е. должно получиться так:

Q_INVOKABLE explicit ScriptObject(QObject *parent = 0);

А в основной программе нужно убрать строку с приведением qobject_cast и заменить строку с регистрацией объекта в движке на вот такую:

QScriptValue scObj = engine.newQObject(plugin->metaObject()->newInstance(), QScriptEngine::ScriptOwnership);

И всё! Никакой привязки к интерфейсу!

Теперь буду разбираться с тем, как бы всё это безобразие соединять сигналами. Как-нибудь по динамичнее.

upd: Не забываем в после засовывания объекта в скрипт его там зарегистрировать.

engine.globalObject().setProperty("ScObj", scObj);
Метки записи: , , Нет комментариев
20Мар/120

Отправляем объект из внешней библиотеки в скрипт

В Qt, как известно, есть замечательная вещь как QScript, позволяющая использовать ECMA скрипт.
В данный скриптовый движок возможно запихивать как отдельные функции, так и целые объекты.
А можно ли запихать в движок объект из внешней библиотеки (.dll, .so etc)?

Оказывается, что можно.

Метки записи: , , , Читать полностью
3Фев/120

Слот. Поиск по QTreeWidget. Еще вариант.

Ищет по листьям. По первому столбцу.
Если дерево одноуровневое, то проверку на childCount можно убрать.

void MyClass::find(QString aFindString)
{
    QTreeWidgetItemIterator it(myTree);
    while (*it)
    {
        if (!(*it)->text(0).contains(aFindString, Qt::CaseInsensitive) && ((*it)->childCount() == 0))
        {
            (*it)->setHidden(true);
        }
        else
        {
            (*it)->setHidden(false);
        }
        ++it;
    }
}

Коннект идентичен.

QLineEdit *findEdit = new QLineEdit(this);
connect(findEdit,SIGNAL(textEdited(QString)),this,SLOT(find(QString)));

Должно работать гораздо быстрее первого варианта :)

Метки записи: , , Нет комментариев
27Янв/120

Слот. Поиск по QTreeWidget.

Поиск работает только в одноуровневом дереве по первому столбцу.

void MyClass::find(QString aFindString)
{
    int childCount = tree->invisibleRootItem()->childCount();
    if(aString != "")
    {
        QList <QTreeWidgetItem *> findList = tree->findItems(aFindString, Qt::MatchContains, 0);
        for(int i = 0; i < childCount; i++)
        {
            tree->invisibleRootItem()->child(i)->setHidden(true);
        }
        int findListSize = findList.size();
        for(int j = 0; j < findListSize; j++)
        {
            findList.at(j)->setHidden(false);
        }
    }
    else
    {
        for(int i = 0; i < childCount; i++)
        {
            tree->invisibleRootItem()->child(i)->setHidden(false);
        }
    }
}

Коннектим так:

QLineEdit *findEdit = new QLineEdit(this);
connect(findEdit,SIGNAL(textEdited(QString)),this,SLOT(find(QString)));
Метки записи: , , Нет комментариев
19Июн/110

Qt. Получение списка сетевых интерфейсов.

QList<QNetworkInterface> getInterface()
{
	//берем все интерфейсы, которые есть в системе
    QList<QNetworkInterface> networkInterfaces = QNetworkInterface::allInterfaces();

    for(int i = 0; i < networkInterfaces.size(); i++)
    {
        QFlags<QNetworkInterface::InterfaceFlags> _flags = networkInterfaces.at(i).flags();
	//если интерфейс выключен или если это вообще loopback
        if(!(QNetworkInterface::IsUp & _flags) || (QNetworkInterface::IsLoopBack & _flags))
        {
		//то убираем его из списка
            networkInterfaces.removeAt(i);
        }
    }
	//возвращаем список работающих и активных интерфейсов
    return networkInterfaces;
}

Метки записи: , , Нет комментариев
11Апр/110

QTableWidget. Запрет редактирования столбцов.

Проще всего делается через делегат.

class NonEditTableColumnDelegate : public QItemDelegate
{
    Q_OBJECT
public:
    NonEditTableColumnDelegate(QObject * parent = 0) : QItemDelegate(parent) {}
    virtual QWidget * createEditor ( QWidget *, const QStyleOptionViewItem &,
                                     const QModelIndex &) const
    {
        return 0;
    }
};

Использование:

aTable = new QTableWidget(this);
aTable->setColumnCount(3);
//запрещаем редактирование первого столбца
aTable->setItemDelegateForColumn(0, new NonEditTableColumnDelegate());
//запрещаем редактирование второго столбца
aTable->setItemDelegateForColumn(1, new NonEditTableColumnDelegate());
//итого из трех столбцов редактироваться будет только последний
Метки записи: , , Нет комментариев