crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

История благодарностей участнику lanz ::: Спасибо сказали: 113 раз(а)
Дата поста: В теме: За сообщение: Спасибо сказали:
15.7.2015, 17:43 QVariant data() роли.
Цитата
Я правильно понимаю? Это так ??

Есть две точки зрения
1. С точки зрения представления - внешний интерфейс модели:
У нас есть модель, неважно где мы ее взяли:
QAbstractItemModel * mdl;

в которой три строки
mdl->rowCount(); // возвращает 3

в которой есть один столбец
mdl->columnCount(); // возвращает 1

получим индекс первой строки первого столбца
QModelIndex idx = mdl->index(0, 0); //нумерация с 0

получим данные для этого элемента
idx.data( Qt::DisplayRole ) или mdl->data( idx, Qt::DisplayRole ); //возвращает QVariant который можно преобразовать в строку "29" (или в число 29, обычно это неважно)
idx.data( Qt::ToolTipRole ) или mdl->data( idx, Qt::ToolTipRole ); //возвращает QVariant который можно преобразовать в строку "Это число!" (например)
idx.data( Qt::DecorationRole ) или mdl->data( idx, Qt::DecorationRole ); //возвращает невалидный QVariant :(

теперь напишем в нужной ячейке текст, который мы получили ("29")
если пользователь навел мышку в ячейку, покажем подсказку ("Это число!")
не будем рисовать иконку, модель ничего не вернула :(

2. Та же самая модель, вид изнутри
class MyModel : public QAbstractListModel {
// .. конструктор
// .. объявления методов
  QVector<int> list = { 29, 15, 5 };
}

int MyModel::rowCount( .. ) {
  return list.size();
}

int MyModel:: columnCount( .. ) {
  return 1;
}

QVariant MyModel::data( const QModelIndex & idx, Qt::ItemDataRole role ) {
  if( role == Qt::DisplayRole ) return list[ idx.row() ];
  if( role == Qt::ToolTipRole ) return "Это число!"; // Для всех элементов подсказка одинаковая

  return QVariant(); // Больше никаких данных ассоциированных с этим элементом (и нет картинки :( )
}
Ponchikus,
15.7.2015, 16:40 QVariant data() роли.
Цитата
К примеру навели мышкой на элемент данных 29, и представление вызывает функцию data() с ролью подсказки (Qt :: ToolTipRole) т.е. передает в функцию индекс модели и константу 13.

Это верно.

Цитата
и именно от этого элемента представление вызывает роли?

Нужно прояснить, что значит "вызывает роли", пока я не понял :lol:

Цитата
И вот по третьему пункту не совсем понятно вот это -- "Роль указывает модели, данные какого типа будут переданы." Какие данные ??

QVariant, который вернется из функции data.
Ponchikus,
15.7.2015, 10:08 QVariant data() роли.
1. Стандартные роли используются стандартными видами в Qt
Здесь описано для чего нужна каждая
http://doc.qt.io/qt-4.8/qt.html#ItemDataRole-enum
Минимально необходимая это Qt::DisplayRole

Роли не вызываются, это просто числа. Представьте что скаждым элементом модели у вас ассоциировано некоторое количество данных:
- текст который показывается пользователю
- картинка
- подсказка
Когда мы говорим модели дай нам данные для элемента Х, мы указываем для чего именно нам нужны данные
Qt::DisplayRole - текст, покажем пользователю, модель должна вернуть текст
Qt::DecorationRole - картинку нарисуем, модель должна вернуть картинку
Qt::ToolTipRole - подсказку по данному элементу

2. Функцию data может вызвать кто угодно, обычно ее вызывает вид(представление)
Эта функция как раз для того чтобы получить данные которые содержит модель.

3. Обязательных ролей нет, но если не обеспечить хотя бы Qt::DisplayRole или Qt::DecorationRole, то ничего не отобразится.

Вот хорошее описание
http://doc.qt.io/qt-4.8/modelview.html
Ponchikus,
8.7.2015, 23:29 Вытащить индекс из модели для мапера
Цитата
Дык это я у модели хотел спросить, какую строку она отображает, что-бы с неё взять ключ и по нему заполнить диалог...

Модель не отображает никакой строки. Конкретная строка отображается именно во вью, в данном случае QWidgetMapper.
QWidgetMapper же и отвечает за заполнение подотчетного виджета.
Какая строка конкретно выделена для этого диалога можно спросить у того вью, в котором выделяются строки и потом сделать
setCurrentIndex() на нее.

Цитата
Нужно что-бы в зависимости от значения поля в БД QComboBox сам выбирал нужную строку, по номеру, типа switch-а ?

Это автоматически делает QWidgetMapper.
JohnZ,
7.7.2015, 16:33 QSerialPort
Цитата
А вот еще один вопрос, что если мне приходящие куски пакетов анализировать и искать в них два байта, которые отвечают за тип сообщения, если два байта найдены, считывать оставшуюся часть пакета,

В принципе нормальный подход, главное не перепутать эти два байта с двумя байтами данных, которые выглядят так же.
leonneon_89,
24.5.2015, 19:05 Запись AT команд в виртуальный COM-порт
Возможны два варианта,
1. Все байты записаны ДО вызова wait
2. Запись длится дольше 200 мс

Попробуйте убрать таймаут, и посмотрите что получится. Если все равно возвращает false, значит первый вариант.
Lya_Inventor,
20.5.2015, 23:50 QSortFilterProxyModel + QAbstractItemModel + QTreeView
У меня все работает :lol:
Смотрите прикрепленный проект.

Скорее всего ошибка здесь:
indxRes = createIndex(pParentItem->m_index.row(), 0, pParentItem);


Нельзя хранить индексы, если очень нужно используйте:
http://doc.qt.io/qt-4.8/qpersistentmodelindex.html
flankerr,
16.5.2015, 22:21 Внешний вид формы
Смотрите в сторону QSortFilterProxyModel
http://doc.qt.io/qt-4.8/qsortfilterproxymodel.html

При выборе изменяете критерии фильтрации.
http://doc.qt.io/qt-4.8/qt-itemviews-basic...el-example.html
http://doc.qt.io/qt-4.8/qt-itemviews-custo...el-example.html
shushunya,
15.5.2015, 9:12 firebird, insert возвращает ошибку -1, строку вставляет
Возможно дело в том, что:
http://doc.qt.io/qt-4.8/qsqlquery.html#QSqlQuery-2
Цитата
Constructs a QSqlQuery object using the SQL query and the database db. If db is not specified, or is invalid, the application's default database is used. If query is not an empty string, it will be executed.

А затем ваш exec пытается вставить второй элемент с таким же id. Попробуйте использовать prepare.
gvenihvivar,
17.4.2015, 17:05 firebird. Подключиться к серверу
Используйте isc_dsql_execute_immediate() из InterbaseAPI
http://www.ibphoenix.com/downloads/60ApiGuide.zip
Или попробуйте просто выполнить запрос через QSqlQuery.
rich,
14.4.2015, 21:35 QSqlRelationalTableMode, сортировка выпадающего списка в QTableView
У меня сортирует, см. вложение :lol:
Единственный подвох - если foreign key в дочерней таблице называется как один из столбцов в основной, его шатает.
maint,
22.3.2015, 23:45 QMimeData, помогите люди добрые.
В файл datamodels.cpp надо добавить #include <QMimeData>
Эта ошибка означает, что класс QMimeData был forward-declared, но не определен. Компилятору нужно знать определение класса чтобы правильно сгенерировать вызов функции-члена.
DruidCat,
12.3.2015, 1:37 OpenGL4.3 в Qt5.1 - подключение функций
http://doc.qt.io/qt-5/qopenglcontext.html#versionFunctions

То что вы используете, возвращает только для GL ES 2

В paintGL происходит перерисовка, там не нужно каждый раз создавать контекст.
Все как то в кучу свалено, почитайте например http://doc.qt.io/qt-5/qtgui-openglwindow-example.html
wf778899,
27.2.2015, 9:33 Перенос строки из одного tableview в другой после двойного нажатия мышки
Вот здесь
http://doc.qt.io/qt-5/qabstracttablemodel.html#details
под заголовком Subclassing перечисленны те методы, которые надо реализовать.

Вот тут простой пример реализации:
http://doc.qt.digia.com/4.6/itemviews-addressbook.html
lexflax,
26.2.2015, 10:06 подклассы Singlton
Цитата
Получаются перекрестные ссылки, и я не нашел решения, как их развязать. Что скажете, сможете предложить решение? или это я не понял ваших комментариев?

Все нормально, нет перекрестных ссылок :lol:
Раскрывающийся текст
class1.h
class Class1 {
Class1 * instance();
...
}

class1.cpp
#include "class1.h"
#include "class2.h"
Class1 * Class1::instance() {
  ...
}

class2.h
#include "class1.h"
class Class2 : public Class1 { ...}

class2.cpp
#include "class2.h"
...
call_me_Frank,
17.2.2015, 20:25 считывание таблицы из xls (Excel)
Фишка в том, что Range() возвращает двумерный массив, т.е. вектор векторов. Доставать как то так
//Считываю список List1
        QAxObject *range1 = worksheet->querySubObject("Range(const QVariant&)",QString("A1:A%1").arg( iAllRow ) );

//Считываю список List2        
        QAxObject *range2 = worksheet->querySubObject("Range(const QVariant&)",QString("B1:B%1").arg( iAllRow ));


//Считываю список List3        
        QAxObject *range3 = worksheet->querySubObject("Range(const QVariant&)",QString("C1:C%1").arg( iAllRow ));

        List1 = qvariant_cast<QVariantList> (range1->dynamicCall("Value()"));
        List2 = qvariant_cast<QVariantList> (range2->dynamicCall("Value()"));
        List3 = qvariant_cast<QVariantList> (range3->dynamicCall("Value()"));

        QList<QVariant>::iterator it = List1.begin();
        int i=1;
        while (it != List1.end())
        {
            QVariantList lst = it->value<QVariantList>();
            ui->textEdit_2->append( lst.begin()->toString() );
            i++;
            it++;
        }

Используйте List1-3 напрямую, зачем вам копировать данные второй раз?
pfuser,
17.2.2015, 19:27 Перенос строки из одного tableview в другой после двойного нажатия мышки
Переопределите свой класс наследник от QAbstractTableModel, я просто поленился.
http://doc.crossplatform.ru/qt/4.7.x/model...rogramming.html
lexflax,
17.2.2015, 0:20 Перенос строки из одного tableview в другой после двойного нажатия мышки
Что то по типу вложения:
lexflax,
16.2.2015, 23:41 чтение txt файла кусками
Цитата
Получается считывает тоже весь файл?

Нет, файл это не последовательное устройство.

Цитата
Как запомнить позицию?

qint64 pos = file.size();

Цитата
хм не знаю, если даже прога и перечитает файл сначала, то поиск будет идти только с новых строк.

Это почему это?

Цитата
buffer.open(QIODevice::WriteOnly);

Открыть файл только для записи. Нужно для чтения.

Цитата
а как в pos() передать последнюю позицию (конец файла)?

file.seek(pos)
Aleksei,
8.2.2015, 21:07 Синхронизация двух QScrollArea.
Добавьте в начало файла
#include <QScrollArea>
#include <QScrollBar>
Valter,
8.2.2015, 17:46 Перенос строки из одного tableview в другой после двойного нажатия мышки
Вам нужно обновить таблицу в БД, а потом обновить модель. Т.е. физически с помощью SQL переносити запись между таблицами, а потом обновлять модель.
Либо использовать QSqlTableModel уоторая позволяет обновлять данные через setData.
lexflax,
3.2.2015, 13:17 делагат для QTableWidget
btnStopGo->setProperty("MyAwesomeCellRow", 1);
btnStopGo->setProperty("MyAwesomeCellCol", 3);


И в получателе
obj->property("My...").toInt()



Либо как предлагали выше, отнаследовать свою кнопку.
borune,
16.1.2015, 20:07 Создание форм
Цитата
0. Пример калькулятора?

Никто не мешает совмещать рисование форм и процедурную генерацию элементов, вообще если формы сложные/сильно нестандартные лучше использовать QML.
Цитата
1. Надо будет изучить...

Там тот же ECMAScript, довольно просто все.
Цитата
2. Ничего не знаю про это

А вот это зря :lol:
ht1515,
16.1.2015, 19:19 Создание форм
Реально, но мне не очень понравилось.
-1. Если используете какой-либо скриптовый язык, делайте лучше программу в форме расширенного интерпретатора языка, а не в виде программы, которая исполняет куски кода через eval, так будет гораздо удобнее.
0. Рисовать формы все равно придется кодом qscript, не проще ли в дизайнере? Сделайте нужные компоненты для дизайнера и пользуйтесь.
1. qscript хорош в связке с QML, если ваши формы динамические, используйте QML.
2. или возьмите PySide или любой другой биндинг.
ht1515,
11.1.2015, 13:52 Сложная синхронизация
Ну во первых, можно использовать обычный QMutex, я не думаю что он будет сильно хуже самопального.
Во вторых, заводите два значения например(это упрощенный мутекс)
int LOCKED = 1;
int UNLOCKED = 0;

Потом лочите структуру
while (!str->guard.testAndSetOrtdered(UNLOCKED, LOCKED));
//Здесь можно пользоватся
str->guard.fetchAndStoreOrdered(UNLOCKED);
// Здесь структура разлочена

В третьих можно использовать две одинаковых структуры и один QAtomicPointer, суть такая - меняем структуру на которую не указывает указатель в данный момент, и с тех пор больше не трогаем структуру, это в принципе упрощенный вариант того, что предложила Iron Bug, т.е. кольцевой буфер из двух элементов, возможно потребуется завести два буфера - один для входящих данных, один для исходящих.
mezmay,

5 страниц V  < 1 2 3 4 > » 
RSS Текстовая версия Сейчас: 19.4.2024, 0:25