1 Востаннє редагувалося Betterthanyou (29.08.2016 10:46:58)

Тема: Qt як отримати сигнал зміни рядка в таблиці

навіщо мені цей сигнал

В мене є таблиця в який є деякі рядки важливіші за інші, які найбільш важливі користувач може вирішувати сам закріплюючи їх або ж навпаки відкріплюючи (закріплені рядки знаходяться зверху а інші сортуються), під таблицею розмішена кнопка яка має змінювати свою назву та призначення залежно від рядка, тобто якщо поточний рядок закріплений то кнопка має називатися "Відкріпити" ну й зрозуміло що має відкріпити рядок, а якщо поточний рядок відкріплений то кнопка має називатися "Закріпити" і закріплювати його

Як отримати сигнал зміни рядка в таблиці ?
Я передивився

всі сигнали

Signals

void    activated(const QModelIndex &index)
void    clicked(const QModelIndex &index)
void    doubleClicked(const QModelIndex &index)
void    entered(const QModelIndex &index)
void    iconSizeChanged(const QSize &size)
void    pressed(const QModelIndex &index)
void    viewportEntered()

і не знайшов потрібного, clicked і pressed працюють тільки з мишкою (так в документації і пише), а мені потрібно щоб сигнал також спрацьовував з навігаційними клавішами (вверх, вниз). Що я не так роблю ?

2

Re: Qt як отримати сигнал зміни рядка в таблиці

Betterthanyou
У вас же таблиця прив'язана до якогось набору даних? От у нього й треба шукати сигнали по зміні поточного активного рядка.

Подякували: Betterthanyou1

3

Re: Qt як отримати сигнал зміни рядка в таблиці

Ну скільки можна на телепатів розраховувати? Ви слово "таблиця" вжили 3 рази, але жодного разу не написали, який саме клас використовуєте. От телепатично мені здається, що вам варто взяти QTableWidget, але я ж не знаю, може, ви з ним і працюєте...

Подякували: Betterthanyou, leofun012

4 Востаннє редагувалося Betterthanyou (29.08.2016 12:32:32)

Re: Qt як отримати сигнал зміни рядка в таблиці

koala написав:

Ну скільки можна на телепатів розраховувати? Ви слово "таблиця" вжили 3 рази, але жодного разу не написали, який саме клас використовуєте. От телепатично мені здається, що вам варто взяти QTableWidget, але я ж не знаю, може, ви з ним і працюєте...

Вибачаюсь


таблиця QTableView
модель QSqlTableModel

Клас форми в якому буде таблиця

class study : public QMainWindow
{
    Q_OBJECT

public:
    explicit study(QWidget *parent = 0);

    ~study();
private slots:
...
private:
    QSqlTableModel *modelCategory;
};

таблиця підключається в конструкторі форми

study::study(QWidget *parent) :
    QMainWindow(parent),
    modelCategory(new QSqlTableModel),
    ui(new Ui::study)
{
    ui->setupUi(this);
/*підключення*/
    modelCategory->setTable( "category" );
    modelCategory->select();
/*налаштування*/
    modelCategory->setHeaderData(1, Qt::Horizontal, "Категорії");
    modelCategory->setHeaderData(4, Qt::Horizontal, "Рейтинг");
    ui->tableViewCategory->setModel( modelCategory );
    ui->tableViewCategory->horizontalHeader()->setSectionResizeMode( QHeaderView::ResizeMode::Stretch );
    ui->tableViewCategory->hideColumn(0);
    ui->tableViewCategory->hideColumn(2);
    ui->tableViewCategory->hideColumn(3);
}

5 Востаннє редагувалося Betterthanyou (29.08.2016 17:01:19)

Re: Qt як отримати сигнал зміни рядка в таблиці

Torbins
В моделі QSqlTableModel є такі сигнали

Signals

Signals

void    beforeDelete(int row)
void    beforeInsert(QSqlRecord &record)
void    beforeUpdate(int row, QSqlRecord &record)
void    primeInsert(int row, QSqlRecord &record)

ще є сигнали успадковані від QAbstractItemModel і QObject
QAbstractItemModel є такі

Signals

Signals

void    columnsAboutToBeInserted(const QModelIndex &parent, int first, int last)
void    columnsAboutToBeMoved(const QModelIndex &sourceParent, int sourceStart, int sourceEnd, const QModelIndex &destinationParent, int destinationColumn)
void    columnsAboutToBeRemoved(const QModelIndex &parent, int first, int last)
void    columnsInserted(const QModelIndex &parent, int first, int last)
void    columnsMoved(const QModelIndex &parent, int start, int end, const QModelIndex &destination, int column)
void    columnsRemoved(const QModelIndex &parent, int first, int last)
void    dataChanged(const QModelIndex &topLeft, const QModelIndex &bottomRight, const QVector<int> &roles = QVector<int> ())
void    headerDataChanged(Qt::Orientation orientation, int first, int last)
void    layoutAboutToBeChanged(const QList<QPersistentModelIndex> &parents = QList<QPersistentModelIndex> (), QAbstractItemModel::LayoutChangeHint hint = QAbstractItemModel::NoLayoutChangeHint)
void    layoutChanged(const QList<QPersistentModelIndex> &parents = QList<QPersistentModelIndex> (), QAbstractItemModel::LayoutChangeHint hint = QAbstractItemModel::NoLayoutChangeHint)
void    modelAboutToBeReset()
void    modelReset()
void    rowsAboutToBeInserted(const QModelIndex &parent, int start, int end)
void    rowsAboutToBeMoved(const QModelIndex &sourceParent, int sourceStart, int sourceEnd, const QModelIndex &destinationParent, int destinationRow)
void    rowsAboutToBeRemoved(const QModelIndex &parent, int first, int last)
void    rowsInserted(const QModelIndex &parent, int first, int last)
void    rowsMoved(const QModelIndex &parent, int start, int end, const QModelIndex &destination, int row)
void    rowsRemoved(const QModelIndex &parent, int first, int last)

Я всі не пробував, але схоже з опису тут немає мені потрібних

koala
QTableWidget - я не хочу використовувати це клас тому що там не можна задати моделі

ui->tableViewCategory->setModel( modelCategory );

метод setModel там захищений тому вставляти таблицю з БД прийдеться за допомогою власного методу



Для вирішення цієї проблеми я створив власний клас таблиці який успадковується від QTableView

mytableview.h

#ifndef MYTABLEVIEW_H
#define MYTABLEVIEW_H

#include <QTableView>
#include <QKeyEvent>

class MyTableView : public QTableView
{
    Q_OBJECT
public:
    MyTableView(QWidget *parent = 0);
protected:
    void keyPressEvent(QKeyEvent *event);
    void mousePressEvent(QMouseEvent *event);
    void eventMouseOrKey();
private:
    int beforeNumber;
signals:
    void rowChange();
};

#endif // MYTABLEVIEW_H

mytableview.cpp

#include "mytableview.h"


MyTableView::MyTableView(QWidget *parent)
    : QTableView(parent),
      beforeNumber( -1 )
{}

void MyTableView::keyPressEvent(QKeyEvent *event)
{

    QTableView::keyPressEvent(event);
    eventMouseOrKey();
}

void MyTableView::mousePressEvent(QMouseEvent *event)
{

    QTableView::mousePressEvent(event);
    eventMouseOrKey();
}

void MyTableView::eventMouseOrKey()
{
    if( beforeNumber != this->currentIndex().row() )
    {
        beforeNumber = this->currentIndex().row();
        emit rowChange();
    }
}

Але все-таки я хотів би найти рішення від Qt

6

Re: Qt як отримати сигнал зміни рядка в таблиці

В інеті радять отримати від таблиці поточний QItemSelectionModel, а уже у нього є потрібні сигнали.

Подякували: leofun011