Russian Qt Forum
Сентябрь 30, 2024, 12:37 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Как сделать QTableView со вкладками  (Прочитано 6176 раз)
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);
   

    }
 

}
 
 
Записан
QtCoder
Гость
« Ответ #1 : Июль 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()
Записан
Patricul
Гость
« Ответ #2 : Июль 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() и срабатывает некорректно! Почему так происходит ума не приложу...
  Может кто-нибудь сталкивался с подобным???
 
Записан
andybeg
Гость
« Ответ #3 : Июль 24, 2011, 23:26 »

немного недопонял как это выглядит, можно картинку?
Записан
Patricul
Гость
« Ответ #4 : Июль 25, 2011, 22:57 »

 То есть, когда я выбираю верхний ряд, то у меня высвечивается информация с индексом (idperson = 1), при том это неверно, потому что у данной фамилии idperson равен 11. Потом когда я выбираю нижний ряд, (будь то второй, третий снизу), то функция currentFamilyChanged (QModelIndex()) вообще не срабатывает, как вы можете увидеть на картинка.  
  И точно такая же ситуация происходит во всех вкладках не зависимо от буквы.  
 
« Последнее редактирование: Июль 26, 2011, 23:05 от Patricul » Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.071 секунд. Запросов: 21.