Реклама
  • EVILEG
  • Комментарий
  • 9 октября 2017 г. 4:23

Qt/C++ - Урок 039. Как закрасить строку в QSqlTableModel по значению в столбце

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

Что вообще должна показывать эта самая TableModel? Список всех пользователей с их статусами?
  • pro100belik
  • Комментарий
  • 9 октября 2017 г. 4:11

Qt/C++ - Урок 039. Как закрасить строку в QSqlTableModel по значению в столбце

Когда пользователь аутентифицируется, то тогда можно будет дёрнуть через QSqlQuery, например, цвет статуса из таблицы профилей.   

Можно как-то объявить переменную QString доступную из разных классов(форм или файлов .cpp)?

TableModel::TableModel(QObject *parent) : QSqlTableModel(parent)
{
    QSqlQuery *qry = new QSqlQuery();
    qry->prepare("select * from users where  id=" +id_user);
    if(qry->exec())
    { qry->next();
        colorstatus1 = qry->value("colorstatus1").toString();
    }
}
 
QVariant TableModel::data(const QModelIndex &idx, int role) const
{
    if(role == Qt::BackgroundColorRole){
      if (idx.sibling(idx.row(),6).data( Qt::DisplayRole ).toInt() == 1)
        {
            return qVariantFromValue(QColor(colorstatus1));
        }
    } else if(role == Qt::DisplayRole){
        return QSqlTableModel::data(idx);
    }
    return QVariant();
}
  • pro100belik
  • Комментарий
  • 9 октября 2017 г. 3:06

Qt/C++ - Урок 039. Как закрасить строку в QSqlTableModel по значению в столбце

Так id пользователя нет в данной таблице.

qry->prepare("select * from users where  id=" + id_user);

colorstatus1 = qry->value("colorstatus1").toString();

Variant value = QSqlQueryModel::data(idx, role);
if(role == Qt::BackgroundColorRole)
{
    if (idx.sibling(idx.row(),6).data( Qt::DisplayRole ).toInt() == 1)
{
    return qVariantFromValue(QColor(colorstatus1));
}
  • EVILEG
  • Комментарий
  • 9 октября 2017 г. 2:44

Qt/C++ - Урок 039. Как закрасить строку в QSqlTableModel по значению в столбце

Теоретически можно воспользоваться QSqlQuery, чтобы выдернуть данные из профиля прямо в методе data. А сам id можно дёрнуть через метод data, как взято значение в колонке через QSqlTableModel::data(this->index(idx.row(), 3)).toInt()

  • EVILEG
  • Ответ
  • 5 октября 2017 г. 13:09

Добавление строки в Combobox

Содержимое ComboBox зависит от модели данных, поэтому наиболее простым вариантом мне кажется наличие пустого поля в самой модели данных.
То есть добавлять нужно в саму модель. Я не знаю, что из себя у вас представляет модель данных, но в самом простом варианте это может выглядеть так.

ComboBox {
    model: ["", "Second", "Third"]
}
Первое значение будет пустым.
Дополнительно добавлять пустые поля можно через методы append или иные, если они присутствуют у модели данных.
Или вы хотите, чтобы при индексе -1 было пусто? Тогда возможно, вам нужно поработать с делегатом, который настраивает внешний вид ComboBox.
ComboBox {
    id: cmbx
    delegate: Item {
        text: (cmbx.currentIndex == -1) ? "" : modelData
    }
}
То есть примерно такой вариант может быть с определёнными уточнениями.

Добавление строки в Combobox

Здравствуйте! Подскажите, как добавить пустую строку в Combobox?

ComboBox {
        id: combo_ceh
        property string id: ""
        currentIndex: -1
        anchors.top: tf_kks.bottom
        anchors.topMargin: 5
        anchors.left: text_ceh.right
        anchors.leftMargin: 5
        Material.accent: Material.LightBlue
        model: model_ceh
        textRole: 'Cehname'
        onCurrentTextChanged: {
            if(currentIndex==-1){
                combo_ceh.id = ""                
            } else {
            combo_ceh.id = model_ceh.getId(currentIndex)            
            }
        }
    }
  • EVILEG
  • Ответ
  • 28 сентября 2017 г. 15:17

Работа с двумерным массивом

Здесь параметр по ссылке нужно передавать.

Или так, если планируете делать изменения в этом объекте
void p_avatar(QVector <QStringList>& model_arr); 
Или как константную ссылку, что более правилньо при разработке (Ограничивать возможность изменения объектов по ссылке, без реалньой необходимости измения этих объектов)
void p_avatar(const QVector <QStringList>& model_arr); 
  • alex_lip
  • Ответ
  • 28 сентября 2017 г. 15:07

Работа с двумерным массивом

Опять запутался как объявить

QVector <QStringList> model_arr;
в appcore.h и как его передать как параметр?
пытаюсь объявить так
void p_avatar( QVector <QStringList> *model_arr);
и передать так
p_avatar(model_arr);  - ругается
ошибка: no matching function for call to 'AppCore::p_avatar(QVector<QStringList>&)'
p_avatar(model_arr);
^
когда передаю так
p_avatar(*model_arr); - ругается
ошибка: no match for 'operator*' (operand type is 'QVector<QStringList>')
p_avatar(*model_arr);
^
Я же объявляю одномерный массив - указатель(*) один должен быть?


  • alex_lip
  • Ответ
  • 28 сентября 2017 г. 14:39

Работа с двумерным массивом

Похоже с учетом того, что число колонок у меня фиксированное - вот такая элементарная конструкция получилась - одномерный массив списка строковых значений!

#include <QCoreApplication>
#include <QStringList>
#include <QDebug>

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    QVector <QStringList> model_arr;
        for (int k=0; k<6; k++)
            {
                model_arr.append({QString::number(k),QString::number(k+1),QString::number(k+2)});

            }
    qDebug()<<"Test";
    qDebug()<<model_arr;
qDebug()<<model_arr[5]; qDebug()<<model_arr[5][2]; return a.exec(); }
  • EVILEG
  • Ответ
  • 27 сентября 2017 г. 22:57

Работа с двумерным массивом

С обычными массивами геморроя много, и то что Вам ответили выше - это лишь малая часть из преимуществ контейнеров типа QVector, std::vector, std::set и т.д.. В продакшене обычные массивы практически не используют, кроме особых случаев, в частности касающихся embedded разработки. В результате всё равно запилите свой костылированный контейнер.


Что касается ошибки, то правильно, что ругается.
Дело в том, что QString **model_arr и QString model_arr[y][6] - это разные типы данных. Нужно всё будет инизиализировать в циклах через new , как показано в той статье, что Вы привели. Указатели будут иметь один и тот же размер, а второй вариант с явным указанием размеров фактичеки будет объектом со всеми этими элементами, который в разы превышает размер указателя указателей на объект QString. В общем - это несовместимые типы данных, или костылировать всякие касты, или инициализировать массив нужного размера через new.

1) Как объявить функцию с параметром двумерный массив

В закоментированной строчке вы в общем-то правильно это дело объявили. Там где с двумя указателями. Нужно только инициализацию через выделение памяти сделать в цикле.

2) Нужно ли инициализировать элементы массива типа

Да. Нужно.

3) как передать массив в функцию

Аргумент для передачи массива в функции написали правильно, только не тот объект передавали.

4) Нужно ли дестроить массив после использования типа

Объекты нужно дестроить всегда, чтобы не было утечек памяти. Другой вопрос в том, в какой момент это делать. Объекты должны быть уничтожены тогда, когда они больше не будут использоваться. А если они ещё где-то используются, то естественно нельзя их уничтожать, иначе получите SEGMENTATION FAULT

Реклама
  • BlinCT
  • 22 октября 2017 г. 12:46

C++ - Тест 003. Условия и циклы

  • Результат 64 баллов
  • Очки рейтинга -1
  • Kiops
  • 22 октября 2017 г. 3:56

C++ - Тест 001. Первая программа и типы данных

  • Результат 86 баллов
  • Очки рейтинга 6
  • Kiops
  • 22 октября 2017 г. 2:41

Qt - Тест 001. Сигналы и слоты

  • Результат 100 баллов
  • Очки рейтинга 10
Последние комментарии
  • EVILEG
  • 21 октября 2017 г. 3:06

Qt/C++ - Урок 031. QCustomPlot - строим график по времени

Добавил архив с проектом

  • EVILEG
  • 20 октября 2017 г. 20:06

Qt/C++ - Урок 031. QCustomPlot - строим график по времени

После работы поищу, должен где-то быть на винте.

  • Миша
  • 20 октября 2017 г. 20:04

Qt/C++ - Урок 031. QCustomPlot - строим график по времени

не могли бы вы выложить архив с рабочей версией скрипта?

  • EVILEG
  • 20 октября 2017 г. 20:03

Qt/C++ - Урок 030. QCustomPlot - быстрый старт в работе с графиками

Использование дизайнера в Qt Creator и использование ui файлов является распространённой практикой в Qt фреймворке. Написать отдельную статью про то, что это такое? - может быть. Опи...

  • Миша
  • 20 октября 2017 г. 19:43

Qt/C++ - Урок 030. QCustomPlot - быстрый старт в работе с графиками

Но почему вы это не описали? Не могли бы вы описать.

Сейчас обсуждают на форуме
  • EVILEG
  • 22 октября 2017 г. 12:05

Закрепление якорей в момент создания объекта через JS

Добрый день! Якоря - это не те свойства, которые можно устанавливать сразу по инициализации, лучше их править после создания объекта, поскольку при одновременной установке они могут в...

  • EVILEG
  • 21 октября 2017 г. 23:33

Создание истории редактирования постов на сайте

Ясно. Тогда я лучше не буду тратить время на его проверку. Тем более, что я использую гугловский prettyprint для подсветки кода. Спасибо за информацию.

QFile::copy() возвращает false

Получилось! Спасибо огромное! path1 = "C:/Users/555/Pictures/00GAF13AP001-002.jpg"true

  • cordsac
  • 19 октября 2017 г. 15:49

How can I select the QGraphicView Item and change the properties

Ok I'll check it sir,If you can please do article(tutorial) about this,Its really useful.Thank you if you can give me some sample code when you free.thanks again

  • cordsac
  • 17 октября 2017 г. 19:28

How can I open SVG file through QT

Okay,Thank you sir :)