Отправляем объект из внешней библиотеки в скрипт
В Qt, как известно, есть замечательная вещь как QScript, позволяющая использовать ECMA скрипт.
В данный скриптовый движок возможно запихивать как отдельные функции, так и целые объекты.
А можно ли запихать в движок объект из внешней библиотеки (.dll, .so etc)?
Оказывается, что можно.
const и все-все-все
char greeting[] = “Hello”; char *p = greeting; // неконстантный указатель, // неконстантные данные *p = "Bye"; // можно ++p; // можно
const char *p = greeting; // неконстантный указатель, // константные данные char const *p = greeting; // то же самое *p = "Bye"; // нельзя ++p; // можно
char * const p = greeting; // константный указатель, // неконстантные данные *p = "Bye"; // можно ++p; // нельзя
const char * const p = greeting; // константный указатель, // константные данные *p = "Bye"; // нельзя ++p; // нельзя
Для функций-членов есть еще один модификатор
int foo() const // гарантирует, что функция не модифицирует // содержимое класса
QHash и структура в качестве ключа.
Тема легкая, но мне, почему-то далась достаточно напряжно.
Задача: использовать в качестве ключа QHash структуру.
Читаем документацию - для данной операции достаточно в структуре определить оператор "==" и написать глобальную функцию qHash для нашей структуры.
Решение:
struct MyStruct
{
quint8 a1;
quint8 a2;
quint8 a3;
quint8 a4;
bool operator==(const MyStruct struc) const
{
return (a1 == struc.a1 &&
a2 == struc.a2 &&
a3 == struc.a3 &&
a4 == struc.a4);
}
};
uint qHash(const MyStruct &struc)
{
//как-то вычисляем хеш
//в моём случае в структуре содержалось 4 целых числа и я просто записал их в одно число со сдвигом
uint result = struc.a1;
result <<=(sizeof(quint8)*8);
result = result|struc.a2;
result <<=(sizeof(quint8)*8);
result = result|struc.a3;
result <<=(sizeof(quint8)*8);
result = result|struc.a4;
return result;
}
Использование:
QHash < MyStruct, QString > myQHash
Всё работает отлично.
А вот при попытке использовать еще одну структуру в качестве значения QHash
QHash < MyStruct, MyOtherStruct > myOtherQHash
При запросе значения по ключу - всё работает отлично, но при попытке получить ключ по значению получаем надпись:
no match for 'operator==' in 'i.QHash<Key, T>::const_iterator::value [with Key = MyStruct, T = MyOtherStruct]() == avalue'
Страшная надпись, не правда ли? :)
Причина - не хватает операции "==" во второй структуре. Добавляем её и всё работает.
Вот так.
struct, key, qhash
Получение произвольного бита из числа.
int bit = (c >> i) & 1
Где с - число, i - номер получаемого бита.
Установка произвольного бита в числе.
b |= (1 << i); // set b &= ~(1 << i); // clear
где b - число, а i - номер бита
Слот. Поиск по 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)));
The Winapi (C Win32 API, No MFC) tutorial
Нашел тут очень приятные и легкие в понимании примеры для WinAPI
На английском.
The Winapi (C Win32 API, No MFC) tutorial
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()); //итого из трех столбцов редактироваться будет только последний