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

20Мар/120

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

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

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

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

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	// гарантирует, что функция не модифицирует
			// содержимое класса
Метки записи: Нет комментариев
21Фев/120

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

Метки записи: , Нет комментариев
10Фев/121

Получение произвольного бита из числа.

int bit = (c >> i) & 1

Где с - число, i - номер получаемого бита.

Метки записи: 1 комментарий
10Фев/120

Установка произвольного бита в числе.

b |= (1 << i);	// set
b &= ~(1 << i);	// clear

где b - число, а i - номер бита

Метки записи: Нет комментариев
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)));
Метки записи: , , Нет комментариев
28Дек/110

The Winapi (C Win32 API, No MFC) tutorial

Нашел тут очень приятные и легкие в понимании примеры для WinAPI
На английском.
The Winapi (C Win32 API, No MFC) tutorial

Метки записи: , Нет комментариев
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());
//итого из трех столбцов редактироваться будет только последний
Метки записи: , , Нет комментариев