June 12, 2019, 1:05 p.m.

Qt

QPrintPreviewDialog, QTableView, print, QTableWidget, Qt

Доброго времени суток.
Снова в качестве заметки.
Возникла необходимость выводить на печать точную копию содержимого QTableWidget c делегатами и т.д.
Получилось следующее:

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

Qt

Delegate, qcheckbox, qcheckbox center, QTableView

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

Jan. 22, 2019, 1:45 p.m.
IscanderChe

Всем добрый день.

Суть задачи: надо, чтобы в одной из колонок QTableView вместо хранимого в QSqlTableModel значения выводился чекбокс и при смене состояния чекбокса значения в базе тоже менялось. С помощью ItemIsUserCheckable проблему удалось решить.

Есть ли вариант решения с помощью кастомного делегата? У меня получается только частично: чекбокс виден только при щелчке на ячейку, данные исправно меняет, но при переходе к другой ячейке чекбокс заменяется данными.

class CheckBoxDelegate : public QStyledItemDelegate
{
    Q_OBJECT

public:
    CheckBoxDelegate(QObject* parent = 0);

    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;
};
QWidget* CheckBoxDelegate::createEditor(QWidget* parent,
    const QStyleOptionViewItem& option,
    const QModelIndex& index) const
{
    if(index.column() == 1)
    {
        QCheckBox* editor = new QCheckBox(parent);
        return editor;
    }

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

void CheckBoxDelegate::setEditorData(QWidget* editor,
    const QModelIndex& index) const
{
    if(index.column() == 1)
    {
        int value = index.model()->data(index, Qt::EditRole).toBool();
        QCheckBox* checkBox = static_cast<QCheckBox*>(editor);
        checkBox->setChecked(value != 0);
    }
}

void CheckBoxDelegate::setModelData(QWidget* editor,
    QAbstractItemModel* model, const QModelIndex& index) const
{
    if(index.column() == 1)
    {
        QCheckBox* checkBox = static_cast<QCheckBox*>(editor);
        bool value = checkBox->isChecked();
        model->setData(index, value, Qt::EditRole);
    }
}

void CheckBoxDelegate::updateEditorGeometry(QWidget* editor,
    const QStyleOptionViewItem& option, const QModelIndex& index) const
{
    editor->setGeometry(option.rect);
}
Dec. 28, 2018, 8:20 a.m.
Михаиллл

Здравствуйте. В QDialog создал TableView и пытаюсь опрределить его индекс. Дебаг возвращает:setGeometry: Unable to set geometry 116x30+2100+419 on QWidgetWindow/'QDialogClassWindow'. Resulting geometry: 178x122+2100+419 (frame: 8, 30, 8, 8, custom margin: 0, 0, 0, 0, minimum size: 178x122, maximum size: 16777215x16777215). Скажите пожалуйста, как узнать индекс?

QDialog dlg(this);
        dlg.setWindowTitle(tr("Выберите активную вакансию"));

        QSqlTableModel *SearchTableModel = new QSqlTableModel(this);
        SearchTableModel ->setTable(NameTableVacancy);
        SearchTableModel->select(); 

        QTableView *ActiveVacancy = new QTableView(&dlg);
        //отображение бд
        ActiveVacancy->setModel(SearchTableModel);
        ActiveVacancy->setSelectionBehavior(QAbstractItemView::SelectRows);  //Разрешаем выделение строк
        ActiveVacancy->setSelectionMode(QAbstractItemView::SingleSelection); //Устанавливаем режим выделения лишь одно строки в таблице

        QDialogButtonBox *btn_box = new QDialogButtonBox(&dlg);
        btn_box->setStandardButtons(QDialogButtonBox::Ok | QDialogButtonBox::Cancel);

        connect(btn_box, &QDialogButtonBox::accepted, &dlg, &QDialog::accept);
        connect(btn_box, &QDialogButtonBox::rejected, &dlg, &QDialog::reject);

        QFormLayout *layout = new QFormLayout();
        layout->addRow(ActiveVacancy);
        layout->addWidget(btn_box);

        dlg.setLayout(layout);

        // В случае, если пользователь нажал "Ok".
        if(dlg.exec() == QDialog::Accepted)
        {
            qDebug()<<ActiveVacancy->currentIndex();

        }
Dec. 26, 2018, 4:38 p.m.
Михаиллл

Здравствуйте. Как узнать что QTableView пуст? Тут пока работает

    QModelIndex IndexForTableView = ui->AllVacancyCompanyTableView->currentIndex();
    qDebug()<<IndexForTableView;

Выдает: QModelIndex(-1,-1,0x0,QObject(0x0)) Дальше пишу:

qDebug()<< ui->AllVacancyCompanyTableView->model()->data(ui->AllVacancyCompanyTableView->model()->index(IndexForTableView.row(),0),0);

и на этом моменте вылетает, хотя по логике должно выдавать "-1"

i
Aug. 24, 2017, 9:05 p.m.
ironexmaiden

Hello guys I have a problem using table view. I have a tableview connected with a QSqlTableModel. On its 2nd column I want to have check state to control the row's Status (active/inactive) but when I try to push the check box QTableView scrolls to the bottom and returns to it's previous position. Is there any solution?

    bool ProjectsModel::setData(const QModelIndex &index, const QVariant &value, int role)
    {
        if(index.column() == STATUS_INDEX) {
            QSqlRecord rec = this->record(index.row());
            QString qrstr;
     
            qrstr = (rec.field(index.column()).value().toInt() == 1) ? "update " + tableName() + " set Status=0 where BRACE_ID=" : "update " + tableName() + " set Status=1 where BRACE_ID=";
            qrstr += QString().setNum(index.row()+1);
     
            braceDatabase->exec(qrstr.toUtf8().constData());
            return true;
        }
     
        return false;
    }
     
    void DataBase::updateTablesSlot()
    {
        if(projectsModel)
            projectsModel->select();
        if(attributesModel)
            attributesModel->select();
        if(targetsModel)
            targetsModel->select();
    }
     
    void DataBase::exec(const std::string &querystr)
    {
    		QSqlQuery qr(db);
            qr.exec(querystr.c_str());
            //qDebug() <<"Command :" << querystr.c_str() << "-> "<< query->lastError().text();
            updateTables(); 
    }
June 15, 2017, 6:58 a.m.

Qt

Qt, QStandardItemModel, QMultiMap, QTableView

QMultiMap is a class inherited from QMap, which allows you to store multiple values for a single key. That is, the key can be repeated. This class can be used, for example, to represent a dictionary of synonyms.

Let's write a small program that will contain two tables:

  1. A table with keys
  2. A table with values that will be synonymous with words in the first table.

Initially, the table with the keys will be filled, while the table with the values will be empty. When you click on a row in the key table, the value table will be filled with synonyms of the word whose string was clicked.

Appearance of the application:

KL
Jan. 29, 2017, 8:26 p.m.
Konstantin Lazarev

Подскажите пожалуйста как применит css к ячейкам таблицы? Как установить фиксированные размеры ячеек таблицы?

Jan. 12, 2017, 6:53 p.m.
Arrow

Подскажите как можно в QTableView реализовать отслеживание нажатия клавиш.

Версия Qt 5.7.

Для решения задачи решил наследоваться от QTableView и переопределить метод keyPressEvent. ниже привожу свой код и подробное описание, что делал.

Файл mtableview.h:

#ifndef MTABLEVIEW_H
#define MTABLEVIEW_H

#include <QObject>
#include <QTableView>
#include <QKeyEvent>

class QTableViewPrivate;

class MTableView : public QTableView
{
public:
    MTableView(QWidget *parent = 0);
    MTableView(QTableViewPrivate &d, QWidget *parent);
signals:
    void keyPressEvent(QKeyEvent *event);
};

#endif // MTABLEVIEW_H

Файл mtableview.cpp:

#include "mtableview.h"

MTableView::MTableView(QWidget *parent):
    QTableView(parent)
{ }

MTableView::MTableView(QTableViewPrivate &d, QWidget *parent)
    : QTableView(d, parent)
{ }

void MTableView::keyPressEvent(QKeyEvent *event)
{
    QTableView::keyPressEvent(event);
}

После чего в дизайнере для элемента QTableView на форме указал "Преобразовать в" и указал свой класс MTableView (все работает)

Ошибки начались при реализации метода keyPressEvent в программе:

connect(ui->lView, &MTableView::keyPressEvent, this, &Wnd::keyPressEvent);
void Wnd::keyPressEvent(QKeyEvent *event)
{
    if(event->key() == Qt::Key_Return)
    {
        on_lView_doubleClicked(ui->lView->currentIndex());
    }
}

Выдает ошибки:

/gcc_64/include/QtCore/qobject.h:-1: In instantiation of 'static QMetaObject::Connection QObject::connect(const typename QtPrivate::FunctionPointer<Func>::Object*, Func1, const typename QtPrivate::FunctionPointer<Func2>::Object*, Func2, Qt::ConnectionType) [with Func1 = void (MTableView::*)(QKeyEvent*); Func2 = void (FManagerWnd::*)(QKeyEvent*); typename QtPrivate::FunctionPointer<Func>::Object = MTableView; typename QtPrivate::FunctionPointer<Func2>::Object = FManagerWnd]':

/gcc_64/include/QtCore/qglobal.h:746: ошибка: static assertion failed: No Q_OBJECT in the class with the signal
 #define Q_STATIC_ASSERT_X(Condition, Message) static_assert(bool(Condition), Message)
                                               ^

/gcc_64/include/QtCore/qobject.h:226: in expansion of macro 'Q_STATIC_ASSERT_X'
         Q_STATIC_ASSERT_X(QtPrivate::HasQ_OBJECT_Macro<typename SignalType::Object>::Value,
         ^

Не могу разобраться, что не так.

P.S. Извините за столько текста :)

Jan. 9, 2017, 3:42 p.m.
Arrow

Для работы с QFileSystemModel использую QTableView. В нем отображаются заголовки колонок: name, size и т.д.

Как можно изменить отображаемые имена заголовков?

И второй вопрос как установить растягивание одной из колонок, чтобы она занимала все сободное пространство?

Для работы с шириной колонок нашел только метод

setColumnWidth()
N
June 25, 2019, 2:41 p.m.
Nico03

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

  • Result:40points,
  • Rating points-8
S
June 25, 2019, 9:16 a.m.
SabaNtuy

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

  • Result:40points,
  • Rating points-8
SZ
June 24, 2019, 5:49 p.m.
Serg Zhi

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

  • Result:78points,
  • Rating points2
Last comments
June 24, 2019, 10:23 a.m.
Евгений Легоцкой

Хорошо, ну будут проблемы помимо того, что касается статей, то не стесняйтесь задавать вопросы на форуме.
МБ
June 24, 2019, 10:21 a.m.
Михаил Булатов

Извиняюсь, все работает(из-за невнимательности).
June 24, 2019, 9:52 a.m.
Евгений Легоцкой

Придётся делать ещё сигнал в дочернем qml и пробрасывать через коннекты и обработчики. А вообще нужно смотреть конкретный код и что вы пытаетесь сделать. Так что лучше будет, если вы зад...
June 21, 2019, 8:31 a.m.
Ruslan Polupan

Вот моя строка по которой все отлично сработало %cqtdeployer% -bin c:/CentralMposKeys/CentalMposKeys.exe -qmake c:/Qt/5.12.2/mingw73_64/bin/qmake.exe
June 21, 2019, 8:24 a.m.
Андрей Янкович

Возможно кому то пригодится сqtdeployer для windows работает точно так же как и для Linux разница лишь в команде запуска Linux: cqtdeployer Windows: %cqtdeployer...
Now discuss on the forum
June 25, 2019, 6:16 p.m.
Алексей Внуков

только через webengine, прямого апи у Яндекса нет, вроде что-то есть у гугла, сам только начал интересоваться этим вопросом
June 25, 2019, 5:05 p.m.
Михаиллл

Само заработало. Странно.
June 25, 2019, 2:32 p.m.
Михаиллл

Похоже глюк вебсокета. К другим вебсокетам подключаюсь.
June 25, 2019, 1:55 p.m.
Андрей Янкович

падало потому что boolStatus был на стеке метода, после завершения метода переменная убивалась, и на обращении к ней было падение.просто сделай вот так: connect(&t, &QTimer::timeou...
June 25, 2019, 10:55 a.m.
IscanderChe

По пункту 3 попытался переписать метод setData. В итоге комбобокс перестал работать. bool MySqlTableModel::setData(const QModelIndex& index, const QVariant& value, int /* role */){...
Looking for a Job?
10,000.00 руб. - 15,000.00 руб.
Нужен помощник для создания API.
Moscow, Moscow, Russia
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