[Еще вариант] Отправляем объект из внешней библиотеки в скрипт.
В первом варианте код был жестко завязан на интерфейсный класс плагина.
Как оказалось, можно обойтись и без него.
Для этого надо:
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);
Отправляем объект из внешней библиотеки в скрипт
В Qt, как известно, есть замечательная вещь как QScript, позволяющая использовать ECMA скрипт.
В данный скриптовый движок возможно запихивать как отдельные функции, так и целые объекты.
А можно ли запихать в движок объект из внешней библиотеки (.dll, .so etc)?
Оказывается, что можно.
Слот. Поиск по 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)));
Должно работать гораздо быстрее первого варианта :)
Слот. Поиск по 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)));
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; }
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()); //итого из трех столбцов редактироваться будет только последний