Название: Как сделать QTableView со вкладками
Отправлено: Patricul от Июль 20, 2011, 15:07
Столкнулся с такой странной проблемой. Мне нужно сделать Вьюшку со вкладками. Наследую Виджет от QTabWidget стобы была доступна функция AddTabs(). Данный код нормально компилируется и запускается. Вьюшка m_pAnketaView появляется, но делает это под вьюшкой m_pTrackRecordView..., т.е. m_pTrackRecordView и кнопки видимы нормально, а m_pAnketaView находится под ними... Картина конечно незаурядная Думал проблема в Лэйаутах, попробывал Грид, но всё равно та же картина, т.е. такое впечатление, что Вьюшки находятся на разных плоскостях... и это очень плохо! Народ если кто-нибудь сталкивался с подобным, то если вас не затруднит подскажите решение. Заранее благодарю... #include "familytab.h" #include <QVBoxLayout>
#include "mydedelegate.h" #include "creport.h"
FamilyTab::FamilyTab(QWidget *parent) : QTabWidget(parent) {
m_pAnketaModel = new QSqlRelationalTableModel(this); m_pAnketaModel->setTable("anketa"); m_pAnketaModel->setFilter("idperson > 0"); m_pAnketaModel->setSort(Anketa_fio,Qt::AscendingOrder); m_pAnketaModel->setHeaderData(Anketa_fio, Qt::Horizontal, tr("ФИО")); m_pAnketaModel->setHeaderData(Anketa_birthdate,Qt::Horizontal, tr("Дата рождения")); m_pAnketaModel->setHeaderData(Aketa_birthplace, Qt::Horizontal, tr("Место рождения")); m_pAnketaModel->setHeaderData(Anketa_adres, Qt::Horizontal,tr("Адрес")); m_pAnketaModel->setHeaderData(Anketa_nomerseria,Qt::Horizontal, tr("Номер/Серия")); m_pAnketaModel->setHeaderData(Anketa_characteristics, Qt::Horizontal, tr("Характеристика")); m_pAnketaModel->setHeaderData(Anketa_addingdate, Qt::Horizontal, tr("Время добавления")); m_pAnketaModel->select();
/* m_pAnketaView = new QTableView; m_pAnketaView->setModel(m_pAnketaModel); m_pAnketaView->setColumnHidden(Anketa_Id, true); m_pAnketaView->setSelectionMode(QAbstractItemView::SingleSelection); m_pAnketaView->setSelectionBehavior(QAbstractItemView::SelectRows); m_pAnketaView->resizeColumnsToContents();*/
m_pTrackRecordModel = new QSqlTableModel(this); m_pTrackRecordModel->setTable("workingtrack"); m_pTrackRecordModel->setHeaderData(workingplace, Qt::Horizontal, tr("Место работы")); m_pTrackRecordModel->setHeaderData(working_enteringdate, Qt::Horizontal, tr("Дата поступления")); m_pTrackRecordModel->setHeaderData(working_sakingdate, Qt::Horizontal, tr("Дата увольнения")); m_pTrackRecordModel->setHeaderData(working_sakingreason, Qt::Horizontal, tr("Причина увольнения"));
m_pTrackRecordView = new QTableView; m_pTrackRecordView->setModel(m_pTrackRecordModel); //m_pTrackRecordView->setItemDelegate(new MyDEDelegate(working_enteringdate, this)); //m_pTrackRecordView->setItemDelegate(new MyDEDelegate(working_sakingdate, this)); m_pTrackRecordView->setSelectionMode(QAbstractItemView::SingleSelection); m_pTrackRecordView->setSelectionBehavior(QAbstractItemView::SelectRows); m_pTrackRecordView->resizeColumnsToContents(); AddTabs();
m_pLayout = new QGridLayout;
m_pAddButton = new QPushButton(QObject::tr("Добавить")); m_pAddButton->setFocusPolicy(Qt::NoFocus); m_pEditButton = new QPushButton(QObject::tr("Редактировать")); m_pEditButton->setFocusPolicy(Qt::NoFocus); m_pDeleteButton = new QPushButton(QObject::tr("Удалить")); m_pDeleteButton->setFocusPolicy(Qt::NoFocus); m_pReportButton = new QPushButton(QObject::tr("Отчёт")); m_pReportButton->setFocusPolicy(Qt::NoFocus); m_pOKButton = new QPushButton(QObject::tr("OK")); m_pOKButton->setFocusPolicy(Qt::NoFocus); m_pQuitButton = new QPushButton(QObject::tr("Выход")); m_pQuitButton->setFocusPolicy(Qt::NoFocus);
m_pButtonLayout = new QHBoxLayout; m_pButtonLayout->addWidget(m_pAddButton); m_pButtonLayout->addWidget(m_pEditButton); m_pButtonLayout->addWidget(m_pDeleteButton); m_pButtonLayout->addWidget(m_pReportButton); m_pButtonLayout->addWidget(m_pOKButton); m_pButtonLayout->addWidget(m_pQuitButton); m_pButtonLayout->addStretch();
// m_pSplitter = new QSplitter(Qt::Vertical); // m_pSplitter->addWidget(m_pAnketaView); // m_pSplitter->addWidget(m_pTrackRecordView);
m_pMainLayout = new QVBoxLayout(this);
m_pMainLayout->addWidget(m_pAnketaView); m_pMainLayout->addWidget(m_pTrackRecordView); m_pMainLayout->addLayout(m_pButtonLayout);
currentFamilyChanged (QModelIndex());
connect(m_pAnketaView->selectionModel(), SIGNAL(currentRowChanged(const QModelIndex &, const QModelIndex &)), this, SLOT(currentFamilyChanged(const QModelIndex &))); connect(m_pTrackRecordModel, SIGNAL(beforeInsert(QSqlRecord &)), this, SLOT(beforeInsertTrack(QSqlRecord &)));
connect(m_pAddButton, SIGNAL(clicked()), this, SLOT(AddTrack())); connect(m_pQuitButton, SIGNAL(clicked()), this, SLOT(close())); connect(m_pOKButton, SIGNAL(clicked()), this, SLOT(ApplyOK())); connect(m_pDeleteButton, SIGNAL(clicked()), this, SLOT(deleteTrack())); connect(m_pEditButton, SIGNAL(clicked()), this, SLOT(EditTrack())); connect(m_pReportButton, SIGNAL(clicked()), this, SLOT(OpenReport()));
}
void FamilyTab::AddTabs() { QSqlQuery query("SELECT fio FROM anketa WHERE idperson > 0"); query.exec(); int index = query.record().indexOf("fio"); QString sBookva; QSet <QString> set; QString sWord; while(query.next()) {
QString sFio = query.value(index).toString(); sBookva = sFio[0];
set << sBookva;
}
foreach(QString value, set)
{ QVariant m_pVariant = value; sWord = m_pVariant.toString();
m_pAnketaView = new QTableView;
m_pAnketaView->setModel(m_pAnketaModel); m_pAnketaView->setColumnHidden(Anketa_Id, true); m_pAnketaView->setSelectionMode(QAbstractItemView::SingleSelection); m_pAnketaView->setSelectionBehavior(QAbstractItemView::SelectRows); m_pAnketaView->resizeColumnsToContents(); addTab(m_pAnketaView, sWord);
}
}
Название: Re: Как сделать QTableView со вкладками
Отправлено: QtCoder от Июль 22, 2011, 09:58
Код полный винигрет. Упрости это. Зачем ты создал наследника от QTabWidget я совсем не понимаю. В QTabWidget могут быть только QTableView. Больше туда ничего пихать не надо. Тебе нужен виджет на который кладешь QTabWidget, и рядом свои кнопки. Т.е. примерно так C++ (Qt) QVBoxLayout * vl = new QVBoxLayout; QTabWidget * tab = new QTabWidget(this); m_pAddButton = new QPushButton(QObject::tr("Добавить")); //......... vl->addWidget(tab); vl->addWidget(m_pAddButton); //.......... AddTabs();// здесь создаешь QTableView и добавляешь через addTab()
Название: Re: Как сделать QTableView со вкладками
Отправлено: Patricul от Июль 24, 2011, 22:42
Да ок! я уже до этого сам додумался... FamilyTab::FamilyTab(QWidget *parent) : QWidget(parent) { AddTabs();
m_pLayout = new QGridLayout;
m_pAddButton = new QPushButton(QObject::tr("Добавить")); m_pAddButton->setFocusPolicy(Qt::NoFocus); m_pEditButton = new QPushButton(QObject::tr("Редактировать")); m_pEditButton->setFocusPolicy(Qt::NoFocus); m_pDeleteButton = new QPushButton(QObject::tr("Удалить")); m_pDeleteButton->setFocusPolicy(Qt::NoFocus); //и т.д. m_pSplitter = new QSplitter(Qt::Vertical); m_pSplitter->addWidget(m_pTabWidget); m_pSplitter->addWidget(m_pTrackRecordView);
m_pMainLayout = new QVBoxLayout(this); //m_pMainLayout->addWidget(m_pSplitter);
m_pMainLayout->addWidget(m_pSplitter); // m_pMainLayout->addWidget(m_pTrackRecordView); m_pMainLayout->addLayout(m_pButtonLayout);
void FamilyTab::AddTabs() { QSqlQuery query("SELECT fio FROM anketa WHERE idperson > 0 ORDER BY fio"); query.exec(); int index = query.record().indexOf("fio"); QString sBookva; QSet <QString> set; QString sWord; m_pTabWidget = new QTabWidget; while(query.next()) {
QString sFio = query.value(index).toString(); sBookva = sFio[0];
set << sBookva;
}
foreach(QString value, set)
{ QVariant m_pVariant = value; sWord = m_pVariant.toString(); // QTableView* m_pAnketaView = static_cast<QTableView*>(currentWidget()); m_pAnketaModel = new QSqlRelationalTableModel(this); m_pAnketaModel->setTable("anketa"); m_pAnketaModel->setFilter("fio LIKE`" + sWord + "%`"); // + "AND idperson > 0" m_pAnketaModel->setSort(Anketa_fio,Qt::AscendingOrder);
m_pAnketaModel->setHeaderData(Anketa_fio, Qt::Horizontal, tr("ФИО")); m_pAnketaModel->setHeaderData(Anketa_birthdate,Qt::Horizontal, tr("Дата рождения")); m_pAnketaModel->setHeaderData(Aketa_birthplace, Qt::Horizontal, tr("Место рождения")); m_pAnketaModel->setHeaderData(Anketa_adres, Qt::Horizontal,tr("Адрес")); m_pAnketaModel->setHeaderData(Anketa_nomerseria,Qt::Horizontal, tr("Номер/Серия")); m_pAnketaModel->setHeaderData(Anketa_characteristics, Qt::Horizontal, tr("Характеристика")); m_pAnketaModel->setHeaderData(Anketa_addingdate, Qt::Horizontal, tr("Время добавления")); m_pAnketaModel->select();
m_pAnketaView = new QTableView; m_pAnketaView->setModel(m_pAnketaModel); m_pAnketaView->setColumnHidden(Anketa_Id, true); m_pAnketaView->setSelectionMode(QAbstractItemView::SingleSelection); m_pAnketaView->setSelectionBehavior(QAbstractItemView::SelectRows); m_pAnketaView->resizeColumnsToContents();
m_pTrackRecordModel = new QSqlTableModel(this); m_pTrackRecordModel->setTable("workingtrack"); m_pTrackRecordModel->setHeaderData(workingplace, Qt::Horizontal, tr("Место работы")); m_pTrackRecordModel->setHeaderData(working_enteringdate, Qt::Horizontal, tr("Дата поступления")); m_pTrackRecordModel->setHeaderData(working_sakingdate, Qt::Horizontal, tr("Дата увольнения")); m_pTrackRecordModel->setHeaderData(working_sakingreason, Qt::Horizontal, tr("Причина увольнения"));
m_pTrackRecordView = new QTableView; m_pTrackRecordView->setModel(m_pTrackRecordModel); //m_pTrackRecordView->setItemDelegate(new MyDEDelegate(working_enteringdate, this)); //m_pTrackRecordView->setItemDelegate(new MyDEDelegate(working_sakingdate, this)); m_pTrackRecordView->setSelectionMode(QAbstractItemView::SingleSelection); m_pTrackRecordView->setSelectionBehavior(QAbstractItemView::SelectRows); m_pTrackRecordView->resizeColumnsToContents(); currentFamilyChanged (QModelIndex());
connect(m_pAnketaView->selectionModel(), SIGNAL(currentRowChanged(const QModelIndex &, const QModelIndex &)), this, SLOT(currentFamilyChanged(const QModelIndex &)));
m_pTabWidget->addTab(m_pAnketaView, sWord);
}
}
Но после того как я сделал вкладки и рассортировал по ним фамилии, то у меня появилась проблема с функцией: void FamilyTab::currentFamilyChanged(const QModelIndex &index) { if (index.isValid()) { QSqlRecord m_precord = m_pAnketaModel->record(index.row()); int id = m_precord.value("idperson").toInt(); m_pTrackRecordModel->setFilter(QString("idperson = %1").arg(id)); } else { m_pTrackRecordModel->setFilter("idperson = -1"); } m_pTrackRecordModel->select(); }
При нажатии на ряд из одной модели, происходит фильтр по idperson у другой. Она вызывается из функции AddTabs() и срабатывает некорректно! Почему так происходит ума не приложу... Может кто-нибудь сталкивался с подобным???
Название: Re: Как сделать QTableView со вкладками
Отправлено: andybeg от Июль 24, 2011, 23:26
немного недопонял как это выглядит, можно картинку?
Название: Re: Как сделать QTableView со вкладками
Отправлено: Patricul от Июль 25, 2011, 22:57
То есть, когда я выбираю верхний ряд, то у меня высвечивается информация с индексом (idperson = 1), при том это неверно, потому что у данной фамилии idperson равен 11. Потом когда я выбираю нижний ряд, (будь то второй, третий снизу), то функция currentFamilyChanged (QModelIndex()) вообще не срабатывает, как вы можете увидеть на картинка. И точно такая же ситуация происходит во всех вкладках не зависимо от буквы. (http://i058.radikal.ru/1107/52/ec7b3942abd9.jpg) (http://www.radikal.ru)
|