Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: QTableView + QSqlTableModel проблемы с добавлением строк
Форум на CrossPlatform.RU > Библиотеки > Qt > Qt Модель/Представление
DAVID
Здравствуйте. Вопрос в том как перед добавлением новой строки в представление искуствено создавать событие нажатия клавиши Enter? Вот код:


#include "main.cpp":
Раскрывающийся текст

#include <QApplication>
#include "connection.h"
#include <iostream>
#include "widget.h"

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    if (!createConnection()) {
        std::cerr << "Unable to open database" << std::endl;
        return 1;
    }

    NameTableWindow namesWindow;
    namesWindow.show();

    return a.exec();
}

#include "PushButton.h" (класс для перехвата события от мыши)
Раскрывающийся текст

#include <QApplication>
#include <QPushButton>
#include <QMouseEvent>

class QMyPushButton : public QPushButton
{
    Q_OBJECT

public:

    QMyPushButton(const QString &text, QWidget *parent = 0) : QPushButton(text, parent) {}

signals:

    void rClicked();

protected:

    void mousePressEvent (QMouseEvent *event)
    {
        if(event->button() == Qt::LeftButton)
        {
            QKeyEvent *event_press = new QKeyEvent (QEvent::KeyPress, Qt::Key_Enter, Qt::NoModifier);
            QApplication::sendEvent (QApplication::focusWidget(), event_press);

            QKeyEvent *event_release = new QKeyEvent (QEvent::KeyRelease, Qt::Key_Enter, Qt::NoModifier);
            QApplication::sendEvent (QApplication::focusWidget(), event_release);

            emit rClicked();

            QWidget::mousePressEvent (event);
        }
    }
};

#include "widget.сpp"
Раскрывающийся текст
NameTableWindow::NameTableWindow(QWidget *parent) : QWidget(parent)
{
    // Create model and load data query
    namesModel = new QSqlTableModel(this);
    namesModel->setTable("names");
    namesModel->setEditStrategy(QSqlTableModel::OnRowChange);

    // Set up the headers
    namesModel->setHeaderData(0,    Qt::Horizontal, tr("id"));
    namesModel->setHeaderData(1,    Qt::Horizontal, tr("First Name"));
    namesModel->setHeaderData(2,    Qt::Horizontal, tr("Surname"));
    namesModel->setHeaderData(3,    Qt::Horizontal, tr("address id"));
    namesModel->setHeaderData(4,    Qt::Horizontal, tr("Comment"));

    // Load the table data
    namesModel->select();

    // Create the view
    namesView = new QTableView(this);
    namesView->setModel(namesModel);
    namesView->setEditTriggers(QAbstractItemView::AnyKeyPressed
                               | QAbstractItemView::DoubleClicked);

    // Removed - this delegate is for QSqlRelationalTableModel
    //namesView->setItemDelegate(new QSqlRelationalDelegate(this));

    namesView->setSelectionMode(QAbstractItemView::SingleSelection);
    namesView->setSelectionBehavior(QAbstractItemView::SelectRows); // select row not cell
    namesView->hideColumn(names_id);
    namesView->resizeColumnsToContents();
    namesView->horizontalHeader()->setStretchLastSection(true);

    // Set up Label
    namesLabel = new QLabel(tr("Names in Table"));
    namesLabel->setBuddy(namesView);

    // ============================================================

    QVBoxLayout *layout = new QVBoxLayout;

    layout->addWidget(namesLabel);
    layout->addWidget(namesView);

    buttonBox = new QDialogButtonBox;
    addButton = new QMyPushButton(tr("Add"));
    rmButton = new QPushButton (tr("Delete"));

    connect(namesView, SIGNAL(activated(QModelIndex)),  namesModel, SLOT(submitAll()));
    connect(rmButton, SIGNAL(clicked()), this, SLOT(remove()));
    connect(addButton, SIGNAL(rClicked()), SLOT(insert() ));
    connect(buttonBox, SIGNAL(accepted()), this, SLOT(close())); // SLOT(accept()));

    buttonBox->addButton(rmButton,    QDialogButtonBox::ActionRole);
    buttonBox->addButton(addButton,   QDialogButtonBox::ActionRole);
    buttonBox->addButton(QDialogButtonBox::Ok);

    layout->addWidget(buttonBox);
    setLayout(layout);

    setWindowTitle(tr("Names Table"));

    namesView->setCurrentIndex(namesModel->index(0,0));
}

void NameTableWindow::insert()
{
    int row = namesView->currentIndex().row();

    if (row < 0) // no record selected - add to end
        row = namesModel->rowCount();

    namesModel->insertRows(row,1);

    namesModel->setData(namesModel->index(row, 1), "    ");
    namesModel->setData(namesModel->index(row, 2), "    ");
    namesModel->setData(namesModel->index(row, 3), "    ");
    namesModel->setData(namesModel->index(row, 4), "    ");

    qDebug("rowCount(): %d", row);

    QModelIndex index = namesModel->index(row,0);

    namesView->setCurrentIndex(index);
    namesView->edit(index);
    namesModel->submitAll();
}

void NameTableWindow::remove()
{
    int row = namesView->currentIndex().row();
    namesModel->removeRow(row);
    namesModel->submitAll();
}

#include "widget.h"
Раскрывающийся текст
enum {      // Field names
    names_id = 0,
    names_firstname = 1,
    names_surname = 2,
    names_address_id = 3,
    names_comment = 4
};

class NameTableWindow: public QWidget
{
    Q_OBJECT

public:

    QMyPushButton *addButton;
    QPushButton *rmButton;

    QSqlTableModel *namesModel;

    QTableView       *namesView;
    QLabel           *namesLabel;
    QDialogButtonBox *buttonBox;


    NameTableWindow(QWidget *parent = 0);

public slots:

    void insert ();
    void remove ();
};
DAVID
Немного изменил файл #include "PushButton.h"
public:

    QTableView *v;

    QMyPushButton(QTableView *view, const QString &text, QWidget *parent = 0) : QPushButton(text, parent), v(view) {}

signals:

    void rClicked();

protected:

    void mousePressEvent (QMouseEvent *event)
    {
        if(event->button() == Qt::LeftButton)
        {
            QKeyEvent *event_press = new QKeyEvent (QEvent::KeyPress, Qt::Key_Enter, Qt::NoModifier);
            QApplication::sendEvent (v, event_press);

            QKeyEvent *event_release = new QKeyEvent (QEvent::KeyRelease, Qt::Key_Enter, Qt::NoModifier);
            QApplication::sendEvent (v, event_release); //QApplication::focusWidget()

            emit rClicked();

            QWidget::mousePressEvent (event);
        }
    }

и файл #include "widget.сpp"
addButton = new QMyPushButton(namesView, tr("Add"));

Теперь вроде все работает...

Однако после редактирования в таблице нескольких строк подряд, и нажатия кнопки "Add" последняя запись не сохраняется. В чем может быть проблема?

Цитата(DAVID @ 11.3.2014, 13:00) *
Немного изменил файл #include "PushButton.h"
public:

    QTableView *v;

    QMyPushButton(QTableView *view, const QString &text, QWidget *parent = 0) : QPushButton(text, parent), v(view) {}

signals:

    void rClicked();

protected:

    void mousePressEvent (QMouseEvent *event)
    {
        if(event->button() == Qt::LeftButton)
        {
            QKeyEvent *event_press = new QKeyEvent (QEvent::KeyPress, Qt::Key_Enter, Qt::NoModifier);
            QApplication::sendEvent (v, event_press);

            QKeyEvent *event_release = new QKeyEvent (QEvent::KeyRelease, Qt::Key_Enter, Qt::NoModifier);
            QApplication::sendEvent (v, event_release); //QApplication::focusWidget()

            emit rClicked();

            QWidget::mousePressEvent (event);
        }
    }

и файл #include "widget.сpp"
addButton = new QMyPushButton(namesView, tr("Add"));

Теперь вроде все работает...

Если редактировать поля одной и той же строки то последняя запись сохраняется...

Однако после редактирования в таблице нескольких строк подряд, и нажатия кнопки "Add" последняя запись не сохраняется. В чем может быть проблема?


[quote name='DAVID' date='11.3.2014, 13:17' post='66610']
Немного изменил файл #include "PushButton.h"
public:

    QTableView *v;

    QMyPushButton(QTableView *view, const QString &text, QWidget *parent = 0) : QPushButton(text, parent), v(view) {}

signals:

    void rClicked();

protected:

    void mousePressEvent (QMouseEvent *event)
    {
        if(event->button() == Qt::LeftButton)
        {
            QKeyEvent *event_press = new QKeyEvent (QEvent::KeyPress, Qt::Key_Enter, Qt::NoModifier);
            QApplication::sendEvent (v, event_press);

            QKeyEvent *event_release = new QKeyEvent (QEvent::KeyRelease, Qt::Key_Enter, Qt::NoModifier);
            QApplication::sendEvent (v, event_release); //QApplication::focusWidget()

            emit rClicked();

            QWidget::mousePressEvent (event);
        }
    }

и файл #include "widget.сpp"
addButton = new QMyPushButton(namesView, tr("Add"));


Теперь вроде все работает...

Если редактировать поля одной и той же строки то последняя запись сохраняется...

Однако после редактирования в таблице нескольких строк подряд, и нажатия кнопки "Add" последняя запись не сохраняется. В чем может быть проблема?
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Форум IP.Board © 2001-2024 IPS, Inc.