April 24, 2019, 10:07 a.m.
Ruslan Polupan

Доброго времени суток.
Где то я упустил что-то при изучении делегатов и их использовании.

Отображение работает. Но после того как выбираешь другую строку таблицы, предидущее выделение сбрсывается.
Не получается выбрать несколько объектов.


Файлы реализации делегата CheckBoxDelegate использовал такие же как в этой статье https://evileg.com/ru/post/478/

Реализация модели modelterminals.h

#ifndef MODELTERMINALS_H
#define MODELTERMINALS_H
#include "terminalclass.h"

#include <QObject>
#include <QAbstractTableModel>

class ModelTerminals : public QAbstractTableModel
{
    Q_OBJECT
    QList<TerminalClass> m_listTerm;
public:
    ModelTerminals(QList<TerminalClass> lsTerm);

    // QAbstractItemModel interface
public:
    int rowCount(const QModelIndex &parent) const;
    int columnCount(const QModelIndex &parent) const;
    QVariant data(const QModelIndex &index, int role) const;
    bool setData(const QModelIndex &index, const QVariant &value, int role);
    Qt::ItemFlags flags(const QModelIndex &index) const;
    QVariant headerData(int section, Qt::Orientation orientation, int role) const;



};

#endif // MODELTERMINALS_H

modelterminals.cpp

#include "modelterminals.h"

ModelTerminals::ModelTerminals(QList<TerminalClass> lsTerm ) :
    m_listTerm(lsTerm)
{

}


int ModelTerminals::rowCount(const QModelIndex &parent) const
{
    return m_listTerm.size();
    Q_UNUSED(parent)
}

int ModelTerminals::columnCount(const QModelIndex &parent) const
{
    return m_listTerm.at(0).colParam();
    Q_UNUSED(parent)
}

QVariant ModelTerminals::data(const QModelIndex &index, int role) const
{
    if(!index.isValid()) { return QVariant();}
    TerminalClass t = m_listTerm[index.row()];
    switch (role) {
    case Qt::DisplayRole:
        switch (index.column()) {
        case 0: return t.isCheced();
        case 1: return t.terminalID();
        case 2: return t.terminalName();
        case 3: return t.regionID();
        case 4: return t.serverName();
        }
        break;
    case Qt::CheckStateRole:
        if(index.column() == 0) {
            return (!t.isCheced()) ? Qt::Checked : Qt::Unchecked;
        }
        break;
    default:
        break;
    }
    return QVariant();
}

bool ModelTerminals::setData(const QModelIndex &index, const QVariant &value, int role)
{
    if(!index.isValid()) {return false;}

    TerminalClass t = m_listTerm[index.row()];

    if(role == Qt::CheckStateRole){
        if(value.toInt() == Qt::Checked){
            t.setIsCheced(true);
        } else {
            t.setIsCheced(false);
        }
        emit dataChanged(index,index);
        return true;
    }
    return false;
}

Qt::ItemFlags ModelTerminals::flags(const QModelIndex &index) const
{
    Qt::ItemFlags flags = QAbstractTableModel::flags(index);
    if(index.isValid() && index.column() == 0){
        flags |= Qt::ItemIsEditable;
    }
    return flags;
}

QVariant ModelTerminals::headerData(int section, Qt::Orientation orientation, int role) const
{
    if( role != Qt::DisplayRole) { return QVariant();}

    if( orientation == Qt::Vertical ) { return section; }

    switch (section) {
    case 0: return "";
    case 1: return "АЗС";
    case 2: return "Адрес";
    case 3: return "Регион";
    case 4: return "Сервер";
    default:
        break;
    }
    return QVariant();
}

Получаю данные для модели и создаю модель

#include "fuelnamedialog.h"
#include "ui_fuelnamedialog.h"

FuelNameDialog::FuelNameDialog(QWidget *parent) :
    QDialog(parent),
    ui(new Ui::FuelNameDialog)
{
    ui->setupUi(this);

    createListTerminals();
    createModelterminals();
}

FuelNameDialog::~FuelNameDialog()
{
    delete ui;
}

void FuelNameDialog::createModelterminals()
{
    qInfo(logInfo()) << "Заружено терминалов:" << listTerminals.size();
    CheckBoxDelegate *delegate = new CheckBoxDelegate();
    modelTerminals = new ModelTerminals(listTerminals);

    ui->tableViewTerminals->setModel(modelTerminals);
    ui->tableViewTerminals->setItemDelegateForColumn(0,delegate);

    ui->tableViewTerminals->verticalHeader()->hide();
    ui->tableViewTerminals->resizeColumnsToContents();

}

void FuelNameDialog::createListTerminals()
{
    QSqlQuery q;
    TerminalClass t;
    if(!q.exec("SELECT t.TERMINAL_ID, TRIM(t.name) AS NAME, t.OWNER_ID AS REGION, c.SERVER_NAME  FROM TERMINALS t "
               "LEFT JOIN CONNECTIONS c ON c.TERMINAL_ID = t.TERMINAL_ID "
               "WHERE t.TERMINALTYPE = 3 AND c.CONNECT_ID = 2 "
               "ORDER BY t.TERMINAL_ID")) {
        qInfo(logInfo()) << Q_FUNC_INFO  << "Не возможно получить список терминалов" << q.lastError().text();
        return;
    }
    while(q.next()){
        t.setIsCheced(false);
        t.setTerminalID(q.value(0).toInt());
        t.setTerminalName(q.value(1).toString());
        t.setRegionID(q.value(2).toInt());
        t.setServerName(q.value(3).toString());
        listTerminals.append(t);
    }

}
April 11, 2019, 10:01 a.m.

Qt

Delegate, qcheckbox, qcheckbox center, QTableView

Доброго времени суток.
Возникла необходимость использовать делегат для отображения QCheckBox в таблице (выбирать объекты из списка для последующей работы с ними).
Для того чтобы разобратся с делегатами создал небольшой проект.
На выходе получаем следующее:

April 9, 2019, 1:30 p.m.
Ruslan Polupan

Доброго времени суток!

Отображение CheckBox Получилось организовать. Правда возник вопрос чтобы в ячейке отображался только он и по центру. Но вот никак не пойму как сделать что бы выбирался Сheckboх. Cовсем что-то запутался или где-то что-то не дочитал. Буду благодарен за любой пинок в нужном направлении....


modelterminals.h

#ifndef MODELTERMINALS_H
#define MODELTERMINALS_H

#include "FuelNameWizard/terminals.h"

#include <QObject>
#include <QAbstractTableModel>

class ModelTerminals : public QAbstractTableModel
{
    Q_OBJECT
    QVector<Terminals> term;
public:
    ModelTerminals(const QVector<Terminals> vek);

    // QAbstractItemModel interface
public:
    int rowCount(const QModelIndex &parent) const;
    int columnCount(const QModelIndex &parent) const;
    QVariant data(const QModelIndex &index, int role) const;
    QVariant headerData(int section, Qt::Orientation orientation, int role) const;

    // QAbstractItemModel interface
public:
    Qt::ItemFlags flags(const QModelIndex &index) const;

    // QAbstractItemModel interface
public:
    bool setData(const QModelIndex &index, const QVariant &value, int role);
};

#endif // MODELTERMINALS_H

modelterminals.cpp

#include "modelterminals.h"

ModelTerminals::ModelTerminals(const QVector<Terminals> vek)
{
    term = vek;
}


int ModelTerminals::rowCount(const QModelIndex &parent) const
{
    return term.size();
}

int ModelTerminals::columnCount(const QModelIndex &parent) const
{
    Terminals *terminal = new Terminals();
    return terminal->colParam();
}

QVariant ModelTerminals::data(const QModelIndex &index, int role) const
{
    if ( !index.isValid() ) { return QVariant(); }
    Terminals t = term[index.row()];
    switch (role) {
    case Qt::DisplayRole:
        switch (index.column()) {
        case 0: return t.isCheked();                           
        case 1: return t.terminal();                    
        case 2: return t.name();                       
        case 3: return t.serverName(); 
        case 4: return t.database();
        case 5: return t.password();
        default: break;
        }
      break;
    case Qt::CheckStateRole:
        if(index.column() == 0)
            return (t.isCheked() != 0) ? Qt::Checked : Qt::Unchecked;
    break;

    default:
        break;
    }

    return QVariant();
}

QVariant ModelTerminals::headerData(int section, Qt::Orientation orientation, int role) const
{
    //Cоздаем заголовки столбцов модели
    if( role != Qt::DisplayRole ) {
        return QVariant();
    }

    if( orientation == Qt::Vertical ) {
        return section;
    }
    switch( section ) {
    case 0:
        return tr( "" );
    case 1:
        return tr( "АЗС" );
    case 2:
        return tr( "Адрес" );
    case 3:
        return tr( "Сервер" );
    case 4:
        return tr( "Файл БД" );
    case 5:
        return tr( "Пароль" );
    }

    return QVariant();
}


Qt::ItemFlags ModelTerminals::flags(const QModelIndex &index) const
{
    Qt::ItemFlags flags = QAbstractTableModel::flags(index);
    if (index.column() == 0)
    {
        flags |= Qt::ItemIsUserCheckable;
        flags |= Qt::ItemIsSelectable;
    }
    else
    {
        flags |= Qt::ItemIsEditable;
        flags |= Qt::ItemIsSelectable;
    }
    return flags;

}

bool ModelTerminals::setData(const QModelIndex &index, const QVariant &value, int role)
{
    Terminals t = term[index.row()];
    if(!index.isValid())
        return false;
    if(role == Qt::CheckStateRole)
    {
        if(value.toInt() == Qt::Checked)
        {
            t.setIsCheked(1);
            return true;
        }
        else
        {
            t.setIsCheked(0);
            return true;
        }
    }
    return  false;
}

Код заполнения модели данными

    Terminals tr;

    QSqlDatabase db = QSqlDatabase::database();
    QSqlQuery q = QSqlQuery(db);

    QString strSQL = "SELECT DISTINCT t.terminal_id, TRIM(t.name), c.SERVER_NAME, c.DB_NAME, c.CON_PASSWORD FROM TERMINALS t "
            "LEFT JOIN CONNECTIONS c ON t.TERMINAL_ID = c.TERMINAL_ID "
            "LEFT JOIN SHIFTS s ON s.TERMINAL_ID = t.TERMINAL_ID "
            "WHERE t.TERMINALTYPE=3 and s.SHIFT_ID>0 "
            "ORDER BY t.TERMINAL_ID";
    if(!q.exec(strSQL)) {
        qInfo(logInfo()) << Q_FUNC_INFO << "Ошибка получения списка терминалов." << q.lastError().text();
        return;
    }

    while (q.next()){
        tr.setIsCheked(0);
        tr.setTerminal(q.value(0).toInt());
        tr.setName(q.value(1).toString());
        tr.setServerName(q.value(2).toString());
        tr.setDatabase(q.value(3).toString());
        tr.setPassword(passConv(q.value(4).toString()));
        terminals.append(tr);
    }
    modelTerminals = new ModelTerminals(terminals);
    ui->tableViewTerminals->setModel(modelTerminals);
Nov. 14, 2018, 11:34 a.m.
Михаиллл

Добрый день!

Пытаюсь сделать QComboBox с QCheckBox. Вот тут https://gist.github.com/mistic100/c3b7f3eabc65309687153fe3e0a9a720

скачал класс.

Но возникли трудности. Если вручную создавать, то не показывает флажки, пока его не выберешь (показано на картинке).

Также не могу вручную добавить новую строчку. Так не работает:

ui->SearchCheakComboBox->addCheckItem("text5", 3, Qt::Unchecked);

И не могу понять, что такое const QVariant &data в функции addCheckItem?

Скажите пожалуйста, как решить эти вопросы?





MS
Nov. 18, 2016, 9:27 a.m.
Mirbadiev Shahboz

Всем привет, кто может подсказать, как проверить статус чекбокса, который находится в таблице QTableWidget.
Библиотека PyQt5
Заносил чекбокс в таблицу таким образом:

B=["ID отдела","Название","Артикул","Дата поступки","Срок хранения","Цена оптом","Цена розница","Кол-во",""]
self.tableWidget = QTableWidget(self.tab2)
self.tableWidget.setRowCount(count1)
self.tableWidget.setColumnCount(9)
self.tableWidget.setColumnWidth(8,30)
self.tableWidget.setColumnWidth(0,120)
self.tableWidget.resize(920,400)
self.tableWidget.setHorizontalHeaderLabels(B)
cursor.execute("SELECT * FROM tovar")
rows = cursor.fetchall()
countTID=0
for row in rows:
self.tableWidget.setItem(countTID,0, QTableWidgetItem(str(row.id_otdela)))
self.tableWidget.setItem(countTID,1, QTableWidgetItem(str(row.nazvanie)))
self.tableWidget.setItem(countTID,2, QTableWidgetItem(str(row.artikul)))
self.tableWidget.setItem(countTID,3, QTableWidgetItem(str(row.data_postupki)))
self.tableWidget.setItem(countTID,4, QTableWidgetItem(str(row.srok_kh)))
self.tableWidget.setItem(countTID,5, QTableWidgetItem(str(row.cena_optom)))
self.tableWidget.setItem(countTID,6, QTableWidgetItem(str(row.cena_roznica)))
self.tableWidget.setItem(countTID,7, QTableWidgetItem(str(row.kolichestvo)))
self.tableWidget.setCellWidget(countTID,8,QCheckBox())
countTID+=1
self.tableWidget.show()

 

Sept. 4, 2015, 3:54 p.m.

Qt

qcheckbox, qcheckbox center, Qt, QTableWidget

One of the first problems in working with The QTableWidget , which are trying to solve, start to work with this widget - setting QCheckBox in the middle of the cell. The fact that the standard check box in QTableWidget checkbox attached to the left edge of the cell, while the right side is given for explanatory text. But the text may not be, but the area still remains. But at the same time it allows you to set QTableWidget in his cell widgets, which we use to solve this problem.

This article is an extension of a previous article on working with QTableWidget , therefore, to see the full code of the project I encourage you also to the article. This article provides only the code necessary to solve the problem.

Project Structure for QCheckBox center

Project structure remains the same as in the previous article .

mainwindow.ui

The form for the application window QCheckBox

In the main application will be placed:

  • QTableWidget
  • QLable
TT
June 13, 2019, 7:01 p.m.
Taimoor Tanweer

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

  • Result:66points,
  • Rating points-1
TT
June 13, 2019, 6:51 p.m.
Taimoor Tanweer

C++ - Test 002. Constants

  • Result:75points,
  • Rating points2
ВМ
June 13, 2019, 12:30 p.m.
Ваня Мороз

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

  • Result:100points,
  • Rating points10
Last comments
МБ
June 20, 2019, 6:23 p.m.
Михаил Булатов

А если мне нужно сделать конект из дочернего qml?Сигнал работает только из main.qml
i
June 17, 2019, 6:10 a.m.
ingenfly

Только по осям xAxis2, уAxis2 значения начинаются с 0. Почему-то xAxis2 и xAxis не синхронизированы по данным. Ну и QCustomPlot последний.
June 16, 2019, 8:21 p.m.
Евгений Легоцкой

Добрый день. Ну точно также добавляете ту же самую информацию на ось xAxis2, только добавляете другое форматирование customPlot->xAxis2->setDateTimeFormat("hh:mm"); если я ...
EF
June 14, 2019, 1:56 p.m.
Egor Fomin

Спасибо за ваш ответ, у меня получилось реализовать это. Тем не менее появилась другая проблема, поэтому опять надеюсь на вашу помощь. Скажем, я уже выставил точки и они соеденены. Когда я нач...
d
June 13, 2019, 2:47 p.m.
damix

Можно классу, который описывает точку, добавить сигнал, который подавать (emit), когда точка перемещается (переопределить mouseMoveEvent или mouseReleaseEvent). Так вот эти сигналы у каждой из...
Now discuss on the forum
June 20, 2019, 9:30 a.m.
IscanderChe

Вернулся к этой задачке только-только, поэтому и не ответил ничего раньше.Как переопределить mouseReleaseEvent(QMouseEvent* event) у QTableView, если QTableView задан в ui? Или задавать QTabl...
I
June 19, 2019, 1:41 p.m.
Intruder

Всем добрый день. При разборе XML файла наткнулся на тег вот такого плана: <TagName attribute1="value1" attribute2="value2" /> При попытке проверить на наличие такого элеме...
June 19, 2019, 12:55 p.m.
Михаиллл

Скажите пожалуйста, как его в таком случае перемещать и удалять?
June 18, 2019, 7:50 p.m.
Дмитрий

Большое спасибо! SDK заработал.К сожалению удалось продвинутся только на один шаг. При сборке чистого проекта NDK выдаёт следующие ошибки C:\Android\ndk-bundle/toolchains/arm-linux-andr...
June 18, 2019, 4:59 p.m.
Михаиллл

Добрый день.В этом учебнике представлен код INSTALLED_APPS = ( ... 'rest_framework', 'snippets.apps.SnippetsConfig',) На строчке 'snippets.apps.SnippetsConf...
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