Privacy policyContactsAbout siteOpinionsGitHubDonate
© EVILEG 2015-2018
Recommend hosting
TIMEWEB
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
AA
April 17, 2019, 7:40 p.m.
Anton Ablin

Qt - Test 001. Signals and slots

  • Result:73points,
  • Rating points1
E
April 17, 2019, 6:16 p.m.
Evgeny

Qt - Test 001. Signals and slots

  • Result:100points,
  • Rating points10
E
April 17, 2019, 6:14 p.m.
Evgeny

Qt - Test 001. Signals and slots

  • Result:78points,
  • Rating points2
Last comments
U
April 18, 2019, 3:37 p.m.
Unreal_man

А как иконку в хедер задать?
u
April 18, 2019, 2:15 a.m.
uaa

доброго времени,большое спасибо за пример для начинающего)при адаптации к своему проекту столкнулся с таким ньансом:в vepolyline.h в 47 строке нужна инициализация по умолчанию: int m_pointF...
E
April 11, 2019, 12:49 p.m.
Evgeny

Спасибо за ответ) У меня компоновщик на нее ругался просто. Оказалось, просто забыл Q_OBJECT в начале класса указать.
April 11, 2019, 12:29 p.m.
Евгений Легоцкой

Добрый день. Вы имели ввиду реализацию? Для сигналов в Qt реализация не пишется, это всё генерируется в moc файлах под капотом Qt.
E
April 11, 2019, 12:15 p.m.
Evgeny

Здравствуйте. А где описание функции signal1()?
Now discuss on the forum
R
April 19, 2019, 9:55 a.m.
RED_Spider

мені важко це зараз навіть перевірити, тому що знайшов коміт, це ще було в 2016 році, і цей код не буде працювати коректно зараз, єдине скажу що це були QThread
i
April 17, 2019, 3:03 p.m.
ilya.guzikov

BlinCT, на стороне ++ это делать необходимо так как в qml при использовании функции append происходит перерисовка всех точек лини(как я понимаю) и из-за этого при использовании больших массиво...
April 10, 2019, 11:20 a.m.
Алексей Внуков

может тоже кому надо будет - QML не принимает QVector<QVector<int>> , при попытке вывести полученый вектор QML показывает что это QVariant(QVector<QVector<int> ...
SN
April 10, 2019, 9:36 a.m.
Stanislav Nykytiuk

Как реализовать такое меню, что бы нажмаешь меню подменю и выбор позиции? Данные меню и подменю в базе SQL.
Join us in social networks

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