June 21, 2019, 6:09 a.m.

QSqlTableModel + QTableView + кастомный делегат QComboBox

Пытаюсь реализовать кастомного делегата на основе QComboBox. Получилось отчасти.
1) При щелчке на ячейке в колонке с делегатом (у меня это колонка 4, status) комбобокс появляется, а хотелось бы, чтобы он был виден всегда.
2) При загрузке виджета, если строк в таблице несколько, только в последней строке заполнена колонка status. Надо, чтоб показывались все.
3) Если щелкнуть на ячейке колонки status, где установлено значение "green", а потом перейти на другую ячейку, то значение предыдущей ячейки сбрасывается на значение "white". Должны сохраняться предыдущие установленные значения.

#include "comboboxdelegate.h"
#include <QComboBox>

ComboBoxDelegate::ComboBoxDelegate(QObject* parent)
{

}

QWidget* ComboBoxDelegate::createEditor(QWidget* parent,
    const QStyleOptionViewItem& option, const QModelIndex& index) const
{
    if(index.column() == 4)
    {
        QComboBox* editor = new QComboBox(parent);
        editor->insertItem(0, "white");
        editor->insertItem(1, "green");
        return editor;
    }

    return QStyledItemDelegate::createEditor(parent, option, index);
}

void ComboBoxDelegate::setEditorData(QWidget* editor, const QModelIndex& index) const
{
    if(index.column() == 4)
    {
        QString value = index.model()->data(index, Qt::EditRole).toString();
        QComboBox* comboBox = static_cast<QComboBox*>(editor);
        if(value == "white")
            comboBox->setCurrentIndex(0);
        else if(value == "green")
            comboBox->setCurrentIndex(1);
    }
}

void ComboBoxDelegate::setModelData(QWidget* editor, QAbstractItemModel* model,
                                    const QModelIndex& index) const
{
    if(index.column() == 4)
    {
        QComboBox* comboBox = static_cast<QComboBox*>(editor);
        QString value = comboBox->currentData().toString();
        model->setData(index, value, Qt::EditRole);
    }
}

void ComboBoxDelegate::updateEditorGeometry(QWidget* editor,
    const QStyleOptionViewItem& option, const QModelIndex& index) const
{
    editor->setGeometry(option.rect);
}
We recommend hosting TIMEWEB
We recommend hosting TIMEWEB
Stable hosting, on which the social network EVILEG is located. For projects on Django we recommend VDS hosting.
29

Добрый день!

А можете ещё прикрепить какой-нибудь пробный проект с этим делегатом? Я бы вечером глянул после работы, что там, да как.

0
// widget.cpp

#include "widget.h"
#include <QTableView>
#include <QVBoxLayout>
#include "checkboxdelegate.h"
#include "comboboxdelegate.h"
#include "mytableview.h"
#include <QSqlDatabase>
#include <QDebug>
#include <QSqlQuery>
#include <QSqlError>
#include <QDate>
#include <QTime>
#include <QSqlRecord>
#include <QApplication>

Widget::Widget(QWidget *parent)
    : QWidget(parent)
{
    // Setup UI
    MyTableView* tableView = new MyTableView();
    QVBoxLayout* layout = new QVBoxLayout;
    layout->addWidget(tableView);
    setLayout(layout);

    QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
    db.setHostName("localhost");
    QString dbName = qApp->applicationDirPath() + "/db.db";
    db.setDatabaseName(dbName);

    if(db.open())
        qDebug() << "DB opened";
    else
        qDebug() << "DB don't opened";

    QSqlQuery query_tbl;
    if(!query_tbl.exec( "CREATE TABLE IF NOT EXISTS tbl ("
                                "id INTEGER PRIMARY KEY AUTOINCREMENT, "
                                "flag INTEGER, "
                                "timeone TIME NOT NULL, "
                                "timetwo TIME NOT NULL, "
                                "status TEXT"
                                ")"
                      )
      )
    {
        qDebug() << "Error of create table";
        qDebug() << query_tbl.lastError().text();
    }
    else
        qDebug() << "Created table";

    QVariantList data;
    int flag = 1;
    data.append(flag);
    data.append(QTime::currentTime());
    data.append(QTime::currentTime());
    QString status = "green";
    data.append(status);
    qDebug() << data;

    QSqlQuery query_ins;
    query_ins.prepare("INSERT INTO tbl (flag, timeone, timetwo, status) "
                      "VALUES (:Flag, :TimeOne, :TimeTwo, :Status)"
                      );
    query_ins.bindValue(":Flag", data.at(0).toInt());
    query_ins.bindValue(":TimeOne", data.at(1).toTime());
    query_ins.bindValue(":TimeTwo", data.at(2).toTime());
    query_ins.bindValue(":Status", data.at(3).toString());

    if(!query_ins.exec())
    {
        qDebug() << "error insert into table";
        qDebug() << query_ins.lastError().text();
    }
    else
        qDebug() << "inserted row";

    model = new MySqlTableModel;
    model->setTable("tbl");

    tableView->setModel(model);

    CheckBoxDelegate* checkBoxDelegate = new CheckBoxDelegate;
    tableView->setItemDelegateForColumn(1, checkBoxDelegate);

    ComboBoxDelegate* comboBoxDelegate = new ComboBoxDelegate;
    tableView->setItemDelegateForColumn(4, comboBoxDelegate);

    tableView->resizeColumnToContents(1);

    model->select();

    connect(tableView, SIGNAL(clickToCheck(QModelIndex)), this, SLOT(changeStateCheckBox(QModelIndex)));
}

Widget::~Widget()
{

}

void Widget::changeStateCheckBox(QModelIndex index)
{
    int state = index.model()->data(index).toBool();
    QVariant value = !state;
    model->setData(index, value);
}

0

1) Насчёт того, чтобы делегат был виден всегда. Можете попробовать переопределить метод paint у делегата

void MyDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const
{
    if (index.column() == 1) // show combobox only in the second column
    {
        QStyleOptionComboBox box;
        box.state = option.state;

        box.rect = option.rect;
        box.currentText = index.data(Qt::EditRole).toString();

        QApplication::style()->drawComplexControl(QStyle::CC_ComboBox, &box, painter, 0);
        QApplication::style()->drawControl(QStyle::CE_ComboBoxLabel, &box, painter, 0);
        return;
    }
    QStyledItemDelegate::paint(painter, option, index);
}

Что-то наподобие такого, только перепишите в рамках вашего делегата.

2) Немного не понял

3) Не уверен, но возможно, что нужно поработать ещё немного с самой моделью данных.

1

По пункту 1 - да, всё получилось, спасибо. Я почти дошёл до этого, но переопределял paint не совсем правильно.

По пункту 2 - картинка в прицепе. Для первых двух комбобоксов значения менялись с их же помощью, для следующих двух значения предустановлены программно.
По пункту 3 - возможно, что надо задействовать модель, я только пока не понимаю, как. Сейчас у меня там кроме формата отображения дат больше ничего нет.

0

По пункту 3 попытался переписать метод setData. В итоге комбобокс перестал работать.

bool MySqlTableModel::setData(const QModelIndex& index, const QVariant& value, int /* role */)
{
    bool ok = true;
    if(index.column() == 4)
    {
        QModelIndex primaryKeyIndex = QSqlTableModel::index(index.row(), 0);
        int id = QSqlTableModel::data(primaryKeyIndex).toInt();
        QSqlQuery query;
        query.prepare("UPDATE tbl SET status = ? WHERE id = ?");
        query.addBindValue(value.toString());
        query.addBindValue(id);
        ok = query.exec();
        select();
    }

    return ok;
}
0

В общем, полностью переписал код, получилось вот что:

// widget.h

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <QSqlTableModel>

class Widget : public QWidget
{
    Q_OBJECT

public:
    Widget(QWidget *parent = 0);
    ~Widget();

private:
    QSqlTableModel* model;
};

#endif // WIDGET_H

// widget.cpp

#include "widget.h"
#include "comboboxdelegate.h"
#include <QTableView>
#include <QVBoxLayout>
#include <QSqlDatabase>
#include <QDebug>
#include <QSqlQuery>
#include <QSqlError>
#include <QTime>
#include <QSqlRecord>
#include <QApplication>

Widget::Widget(QWidget *parent)
    : QWidget(parent)
{
    QTableView* tableView = new QTableView;
    QVBoxLayout* layout = new QVBoxLayout;
    layout->addWidget(tableView);
    setLayout(layout);

    QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
    db.setHostName("localhost");
    QString dbName = qApp->applicationDirPath() + "/db.db";
    db.setDatabaseName(dbName);

    if(db.open())
        qDebug() << "DB opened";
    else
        qDebug() << "DB don't opened";

    QSqlQuery query_tbl;
    if(!query_tbl.exec( "CREATE TABLE IF NOT EXISTS tbl ("
                                "id INTEGER PRIMARY KEY AUTOINCREMENT, "
                                "timeone TIME NOT NULL, "
                                "timetwo TIME NOT NULL, "
                                "status TEXT"
                                ")"
                      )
      )
    {
        qDebug() << "Error of create table";
        qDebug() << query_tbl.lastError().text();
    }
    else
        qDebug() << "Created table";

    QVariantList data;
    data.append(QTime::currentTime());
    data.append(QTime::currentTime());
    QString color = "white";
    data.append(color);
    qDebug() << data;

    QSqlQuery query_ins;
    query_ins.prepare("INSERT INTO tbl (timeone, timetwo, status) "
                      "VALUES (:TimeOne, :TimeTwo, :Status)"
                      );
    query_ins.bindValue(":TimeOne", data.at(0).toTime());
    query_ins.bindValue(":TimeTwo", data.at(1).toTime());
    query_ins.bindValue(":Status", data.at(2).toString());

    if(!query_ins.exec())
    {
        qDebug() << "error insert into table";
        qDebug() << query_ins.lastError().text();
    }
    else
        qDebug() << "inserted row";

    model = new QSqlTableModel;
    model->setTable("tbl");

    tableView->setModel(model);

    ComboBoxDelegate* delegate = new ComboBoxDelegate;
    tableView->setItemDelegateForColumn(3, delegate);

    model->select();
}

Widget::~Widget()
{

}

// comboboxdelegate.h

#ifndef COMBOBOXDELEGATE_H
#define COMBOBOXDELEGATE_H

#include <QStyledItemDelegate>

class ComboBoxDelegate : public QStyledItemDelegate
{
    Q_OBJECT

public:
    ComboBoxDelegate();

    QWidget* createEditor(QWidget *parent, const QStyleOptionViewItem &option,
                          const QModelIndex &index) const override;

    void setEditorData(QWidget* editor, const QModelIndex& index) const override;

    void setModelData(QWidget *editor, QAbstractItemModel *model,
                      const QModelIndex &index) const override;

    void updateEditorGeometry(QWidget *editor,
            const QStyleOptionViewItem &option, const QModelIndex &index) const override;

    void paint(QPainter* painter,
        const QStyleOptionViewItem& option, const QModelIndex& index) const override;
};

#endif // COMBOBOXDELEGATE_H

// comboboxdelegate.cpp

#include "comboboxdelegate.h"
#include <QComboBox>
#include <QApplication>
#include <QSqlQuery>
#include <QSqlTableModel>

ComboBoxDelegate::ComboBoxDelegate()
{

}

QWidget* ComboBoxDelegate::createEditor(QWidget *parent,
                                        const QStyleOptionViewItem &option,
                                        const QModelIndex &index) const
{
    QComboBox* comboBox = new QComboBox(parent);
    QPair<QString, int> pair;
    QList<QPair<QString, int> > dataList;
    pair.first = "white";
    pair.second = 0;
    dataList << pair;
    pair.first = "yellow";
    pair.second = 1;
    dataList << pair;
    pair.first = "green";
    pair.second = 2;
    dataList << pair;

    for(int i = 0; i < dataList.size(); ++i)
    {
        QPair<QString, int> item = dataList.at(i);
        comboBox->addItem(item.first, item.second);
    }

    comboBox->setCurrentIndex(0);

    return comboBox;
}

void ComboBoxDelegate::setEditorData(QWidget *editor, const QModelIndex &index) const
{
    if(index.column() == 3)
    {
        QString value = index.model()->data(index, Qt::EditRole).toString();
        QComboBox* comboBox = static_cast<QComboBox*>(editor);
        if(value == "white")
            comboBox->setCurrentIndex(0);
        else if(value == "yellow")
            comboBox->setCurrentIndex(1);
        else if(value == "green")
            comboBox->setCurrentIndex(2);
    }
}

void ComboBoxDelegate::setModelData(QWidget *editor, QAbstractItemModel *model,
                                    const QModelIndex &index) const
{
    QComboBox *edit = static_cast<QComboBox *>(editor);
    QSqlTableModel* sqlModel = static_cast<QSqlTableModel*>(model);
    QModelIndex primaryKeyIndex = sqlModel->index(index.row(), 0);
    int id = sqlModel->data(primaryKeyIndex).toInt();
    QString value = edit->currentText();
    QSqlQuery query;
    query.prepare("UPDATE tbl SET status = ? WHERE id = ?");
    query.addBindValue(value);
    query.addBindValue(id);
    query.exec();
    sqlModel->select();
}

void ComboBoxDelegate::updateEditorGeometry(QWidget *editor,
    const QStyleOptionViewItem &option, const QModelIndex &/*index*/) const
{
    editor->setGeometry(option.rect);
}

void ComboBoxDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option,
                             const QModelIndex &index) const
{
    if(index.column() == 3)
    {
        QStyleOptionComboBox comboBoxStyleOption;
        comboBoxStyleOption.state = option.state;
        comboBoxStyleOption.rect = option.rect;
        comboBoxStyleOption.currentText = index.data(Qt::EditRole).toString();

        QApplication::style()->drawComplexControl(QStyle::CC_ComboBox, &comboBoxStyleOption, painter, 0);
        QApplication::style()->drawControl(QStyle::CE_ComboBoxLabel, &comboBoxStyleOption, painter, 0);

        return;
    }

    QStyledItemDelegate::paint(painter,option, index);
}

Всё работает как надо: выставляется значение по умолчанию white, сохраняются значения, выставленные ранее. Осталось только одно затруднение: доступ к комбобоксу осуществляется после двойного щелчка мыши. Хотелось бы с первого щелчка.

0

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

tableView->setEditTriggers(QAbstractItemView::AllEditTriggers);
0

Теперь со второго щелчка работает: вначале выделить ячейку, потом уже работать с выпадающим списком.
И выделяется первая ячейка для редактирования текста, что совсем не надо. Похоже, надо опять думать в сторону собственной реализации QTableView...

0

"Теперь со второго щелчка работает: вначале выделить ячейку, потом уже работать с выпадающим списком." Это осталось, а вот с редактированием удалось успешно закрыть вопрос. Добавилась собственная реализация QTableView и несколько строк в widget.cpp.

// mytableview.h

#ifndef MYTABLEVIEW_H
#define MYTABLEVIEW_H

#include <QTableView>

class MyTableView : public QTableView
{
    Q_OBJECT

public:
    MyTableView(QObject* parent = 0);

    void mouseMoveEvent(QMouseEvent* event) override;

signals:
    void mouseHover(QModelIndex index);
};

#endif // MYTABLEVIEW_H

// mytableview.cpp

#include "mytableview.h"
#include <QMouseEvent>

MyTableView::MyTableView(QObject* /*parent*/)
{

}

void MyTableView::mouseMoveEvent(QMouseEvent* event)
{
    QPoint position = event->pos();
    QModelIndex index = indexAt(position);
    emit mouseHover(index);
}

// widget.h

#ifndef WIDGET_H
#define WIDGET_H

#include "mytableview.h"
#include <QWidget>
#include <QSqlTableModel>
#include <QTableView>

class Widget : public QWidget
{
    Q_OBJECT

public:
    Widget(QWidget *parent = 0);
    ~Widget();

private:
    QSqlTableModel* model;
    MyTableView* tableView;

private slots:
    void mouseHover(QModelIndex index);
};

#endif // WIDGET_H

// widget.cpp
...
    tableView->setEditTriggers(QAbstractItemView::NoEditTriggers);
    tableView->setSelectionMode(QAbstractItemView::SingleSelection);
    tableView->setSelectionBehavior(QAbstractItemView::SelectRows);
    tableView->setSortingEnabled(true);
    tableView->setMouseTracking(true);

    connect(tableView, SIGNAL(mouseHover(QModelIndex)), this, SLOT(mouseHover(QModelIndex)));
}

Widget::~Widget()
{

}

void Widget::mouseHover(QModelIndex index)
{
    if(index.column() != 3)
        tableView->setEditTriggers(QAbstractItemView::NoEditTriggers);
    if(index.column() == 3)
        tableView->setEditTriggers(QAbstractItemView::AllEditTriggers);
}

Огромное спасибо за помощь по работе с моделями! Трудновато, но очень интересно.)

0

С проблемой редактирования текста разобрался с помощью другого дружественного ресурса путём наследования модели и переписывания метода flags. Получилось более элегантно и без костылей в виде кастомного QTableView:

Qt::ItemFlags MySqlTableModel::flags(const QModelIndex& index) const
{
    if(index.column() == 0 || index.column() == 1)
    {
        Qt::ItemFlags flags = QSqlTableModel::flags(index);
        flags = Qt::ItemIsEnabled | Qt::ItemIsSelectable;
        return flags;
    }

    return QSqlTableModel::flags(index);
}

Но вылезла другая интересная проблема. Как удалось выяснить, при выборе другого значения в комбобоксе данные вносятся в базу данных только после щелчка на другой ячейке или свободном пространстве. Можно это как-то побороть, чтобы данные записывались сразу после выбора значения?

0

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

0

Если напрямую из setEditorData делать так:

emit commitData(editor);

то компилятор выдаёт ошибку: "passing 'const ComboBoxDelegate' as 'this' argument discards qualifiers [-fpermissive]"

0

commitData ожидает неконстантный указатель на виджет, а у вас туда передаётся константный указатель.

0

В общем, мозг сломал, но так ничего и не придумал... Слишком тонкие намёки для меня.))
Вот если бы чуть более развёрнутое объяснение... И примеров кода не надо! Только объяснение.

0

А мне бы наоборот код глянуть )) Можете показать, где у вас emit commitData(editor) используется? А то я всё уже в голове не успеваю держать, детали из памяти истераются.

0
void ComboBoxDelegate::setEditorData(QWidget* editor, const QModelIndex& index) const
{
    qDebug() << "Work setEditorData";
    if(index.column() == 2)
    {
        QString value = index.model()->data(index, Qt::EditRole).toString();
        QComboBox* comboBox = static_cast<QComboBox*>(editor);

        QSqlQuery querySelect("SELECT status FROM statuses");
        QStringList statusList;
        if(!querySelect.exec())
        {
            qDebug() << "Error select from statuses";
            qDebug() << querySelect.lastError().text();
        }
        else
        {
            while(querySelect.next())
                statusList << querySelect.value(0).toString();
        }

        for(int i = 0; i < statusList.size(); ++i)
        {
            if(value == statusList.at(i))
            {
                comboBox->setCurrentIndex(i);
                emit commitData(editor);
            }
        }
    }
}
0

Придумал. Вот что попробуйте, сделайте в методе createEditor коннект лямбды на изменение текущего индекса. В котором и будете делать commitData.

QWidget* ComboBoxDelegate::createEditor(QWidget* parent,
    const QStyleOptionViewItem& option, const QModelIndex& index) const
{
    if(index.column() == 4)
    {
        QComboBox* editor = new QComboBox(parent);
        editor->insertItem(0, "white");
        editor->insertItem(1, "green");

        connect(comboBox, QOverload<int>::of(&QComboBox::currentIndexChanged), [=](int index)
        {
            emit commitData(editor);
        });
        return editor;
    }

    return QStyledItemDelegate::createEditor(parent, option, index);
}

По идее, когда вы измените значение, тогда сразу и вызовется применение изменений.

0

Спасибо, попробую завтра. На работе у меня стоит 5.11, там QOverload поддерживается. А вот дома стоит 5.5.1, и этого там ещё нет...
Не знаете, как правильно под 32-битный линукс скомпилить одновременно и QtCreator, и свежий Qt? Несколько надоело быть ограниченно годным в домашних условиях.

0

Ну я никогда не компилировал сам Qt, просто устанавливал нужные версии через Qt Maintanence Tool и всё. Этого достаточно было.

0

Вот ещё, кстати, вопрос не по теме. В сообщениях указывается время, отличное от моего местного. Это правильно? Особо не мешает, но вопрос есть. :) Хорошо бы настроить возможность определять/задавать часовой пояс в профиле пользователя.

0

Всё равно ругается: "passing 'const ComboBoxDelegate' as 'this' argument discards qualifiers [-fpermissive] emit commitData(comboBox);".

QWidget* ComboBoxDelegate::createEditor(QWidget* parent,
                                        const QStyleOptionViewItem& /*option*/,
                                        const QModelIndex& /*index*/) const
{
    QComboBox* comboBox = new QComboBox(parent);
    QSqlQuery querySelect("SELECT status FROM statuses");
    QStringList statusList;
    if(!querySelect.exec())
    {
        qDebug() << "Error select from statuses";
        qDebug() << querySelect.lastError().text();
    }
    else
    {
        while(querySelect.next())
            statusList << querySelect.value(0).toString();
    }

    foreach(QString status, statusList)
        comboBox->addItem(status);

    comboBox->setCurrentIndex(0);

    connect(comboBox, QOverload<int>::of(&QComboBox::currentIndexChanged), [=](int index)
    {
        emit commitData(comboBox);
    });

    return comboBox;
}
0

Да надо бы это сделать. Я столкнулся в Django с тем, что довольно трудоёмко реализовать автоматическую детекцию часового пояса. А в официальной документации сказано, что добавляйте у пользователя поле для настройки часового пояся и выбирайте из него данные. Ну наверное да, нужно сделать ))))

1

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

1

Сигнал работает, сообщение "ComboBox index changed" появляется в момент смены значения, всё как надо. Только как теперь в модель всё это передать? Доступа-то к ней из слота нет.

QWidget* ComboBoxDelegate::createEditor(QWidget* parent,
                                        const QStyleOptionViewItem& /*option*/,
                                        const QModelIndex& /*index*/) const
{
    QComboBox* comboBox = new QComboBox(parent);
    QSqlQuery querySelect("SELECT status FROM statuses");
    QStringList statusList;
    if(!querySelect.exec())
    {
        qDebug() << "Error select from statuses";
        qDebug() << querySelect.lastError().text();
    }
    else
    {
        while(querySelect.next())
            statusList << querySelect.value(0).toString();
    }

    foreach(QString status, statusList)
        comboBox->addItem(status);

    comboBox->setCurrentIndex(0);

    connect(comboBox, SIGNAL(currentIndexChanged(int)), this, SLOT(changedComboBox(int)));

    return comboBox;
}

void ComboBoxDelegate::changedComboBox(int /*index*/)
{
    qDebug() << "ComboBox index changed";
}
0

Попробуйте так

void ComboBoxDelegate::changedComboBox(int /*index*/)
{
    emit commitData(qobject_cast<QComboBox*>(sender()));
}
1

Сработало! Спасибо!!!

1

Кстати, скорее всего на новом синтаксисе сигналов и слотов через указатели на методы не получится так сделать. Дело в том, что Макросы кладут болт на некоторые моменты в плане приватности и константности объектов... Но я бы проверил...

Можете проверить коннект так? Любопытства ради. Если я правильно понимаю, то тогда не сможет скомпилироваться...

connect(comboBox, QOverload<int>::of(&QComboBox::currentIndexChanged), this, &ComboBoxDelegate::changedComboBox);
0

Скомилировалось и нормально работает.

1

Хорошо, значит ошибочная мысль была. Спасибо.

Оставьте тогда на новом синтаксисе. Уже не комильфо использовать старый синтаксис )))

1

Comments

Only authorized users can post comments.
Please, Log in or Sign up
AD
July 19, 2019, 9:51 a.m.
Anastasia Dutchina

C++ - Test 001. The first program and data types

  • Result:53points,
  • Rating points-4
AD
July 19, 2019, 9:46 a.m.
Anastasia Dutchina

Qt - Test 001. Signals and slots

  • Result:57points,
  • Rating points-2
DZ
July 19, 2019, 5:01 a.m.
Damira Zholdasbay

C ++ - Test 004. Pointers, Arrays and Loops

  • Result:60points,
  • Rating points-1
Last comments
July 19, 2019, 3:29 p.m.
IscanderChe

Спасибо, уже разобрался по оригинальной статье на GitHub, всё заработало. Я просто хотел мягко намекнуть, что без этой информации ваша статья явно неполная.
July 19, 2019, 3:16 p.m.
Ruslan Polupan

Вот ссылка по работе с ключами и GitHub https://exlmoto.ru/git-and-qt-creator/#31 Сгенерируй новый ключ и добваь его на GitHub.
July 19, 2019, 3:03 p.m.
IscanderChe

В какой статье? Какой ключ? Как добавить? Ничего не понятно. :) Если из этой , то как понять, какой дефолтный у меня агент SSH.
July 19, 2019, 1:43 p.m.
Ruslan Polupan

Ключ не верный или не действительный. сформируй новый и добавь на GitHub В статье описапно как сделать.
July 19, 2019, 12:55 p.m.
IscanderChe

У меня ошибка случилась ещё до Qt Creator, я ж написал. На этапе загрузки проекта из командной строки на GitHub.
Now discuss on the forum
July 19, 2019, 10:55 a.m.
Mihailll

Да. Там похоже каждое устройство генерирует свой токен, этот токен нужно как то получать и использовать в запросе. Но как это делать я пока не понял.
July 19, 2019, 10:52 a.m.
Mihailll

Суть понятна, но не понятно где и как это использовать. Как я понимаю для начала нужно получить координату на поле и находящийся эллемент на этой координате в этой части кода void Mov...
July 19, 2019, 9:31 a.m.
Mihailll

Добрый день. Повернул ListView в горизонтальное положение. При прокрутке эллементы выстраиваются у левого края окна. Как в QMK в ListView сделать центрирование по центру? ...
b
July 18, 2019, 2:27 a.m.
bbb116

Когда отрисовки не видно, объекты AreaSelector создаются (при нажатии и движении мышкой), но почему то не срабатывает paint() у них, хотя делаю update этой области. Причем эти области мо...
July 17, 2019, 5:54 a.m.
Aleksej Vnukov

хочу не стандартный набор символов, а все ненужное убрать чтоб не мешало. для начала решил посмотреть как работает клава на родном примере, а он на телефоне не взлетел вот и начал разби...
Looking for a Job?
25,000.00 руб. - 30,000.00 руб.
Разработчик Qt/C++
Barnaul, Altai Krai, Russia

For registered users on the site there is a minimum amount of advertising

EVILEG
About
Services
Join us
© EVILEG 2015-2019
Recommend hosting TIMEWEB