Russian Qt Forum

Qt => Вопросы новичков => Тема начата: chu от Февраль 28, 2011, 22:41



Название: QTabBar и QTableView/QSqlTableModel
Отправлено: chu от Февраль 28, 2011, 22:41
есть 2 таблицы с одинаковыми полями, хочу переключатся между ними по табам.
сделал так:
Код:
CheckForm::CheckForm(QWidget *parent)
    :QDialog(parent)
{
    setWindowFlags(Qt::Window);

    checkModel = new  QSqlRelationalTableModel;
    checkModel->setTable("send");
    checkModel->setRelation(Check_Product, QSqlRelation("product", "id", "title"));
    checkModel->setSort(Check_Id, Qt::AscendingOrder);
    checkModel->setHeaderData(Check_Mark, Qt::Horizontal, tr("обозначение"));
    checkModel->setHeaderData(Check_Det, Qt::Horizontal, tr("наименование"));
    checkModel->setHeaderData(Check_SendSum, Qt::Horizontal, tr("сдано"));
    checkModel->setHeaderData(Check_SendDate, Qt::Horizontal, tr("дата и время сдачи"));
    checkModel->setHeaderData(Check_RecvSum, Qt::Horizontal, tr("принято"));
    checkModel->setHeaderData(Check_RecvDate, Qt::Horizontal, tr("дата и время приема"));
    checkModel->setHeaderData(Check_Product, Qt::Horizontal, tr("Изделие"));
    checkModel->setEditStrategy(QSqlTableModel::OnFieldChange);
    checkModel->select();

    checkTableView = new QTableView;
    checkTableView->setModel(checkModel);
    checkTableView->setColumnHidden(Check_Id, true);
    checkTableView->setSelectionBehavior(QAbstractItemView::SelectRows);
    checkTableView->resizeColumnsToContents();

    deleteButton  = new QPushButton(tr("Удалить"));
    closeButton = new QPushButton(tr("Закрыть"));

    connect(closeButton, SIGNAL(clicked()), this, SLOT(close()));
    connect(deleteButton, SIGNAL(clicked()), this, SLOT(deleteCheck()));

    tabBar = new QTabBar(this);
    tabBar->addTab(tr("из 3 в 4"));
    tabBar->addTab(tr("из 3 на склад"));

    connect(tabWidget, SIGNAL(currentChanged(int)), this, SLOT(changeTable(int)));

    QGridLayout *lay = new QGridLayout;
    lay->addWidget(tabWidget, 0, 0);
    lay->addWidget(checkTableView, 1, 0, 4, 1);
    lay->addWidget(deleteButton, 1, 1, 1, 1);
    lay->addWidget(closeButton, 3,1,1,1);
    lay->setRowStretch(2,10);
    setLayout(lay);

    resize (1024, 640);
    setWindowTitle(tr("Акты сдачи/приёмки"));
}

void CheckForm::changeTable(int tab){
    if(tab==0){
        checkModel->setTable("send");
        checkModel->select();
    }
    if(tab==1){
        checkModel->setTable("store");
        checkModel->select();
    }
}
пришлось создать 2 TableView, т.к. QTabWidget не хотел создавать 2 таба с одинаковыми виджетами.
при переключении сбрасываются названия заголовков и появляются пустые строки,
кол-во пустых строк = кол-ву строк предыдушего TableView.
как исправить?


Название: Re: QTabWidget и QTableView/QSqlTableModel
Отправлено: maint от Март 01, 2011, 06:57
внимательно смотрим в текст. Каждый раз НА ОДНОЙ И ТОЙ ЖЕ глобально описаной переменной заново создается новая модель и табвиджет


Название: Re: QTabWidget и QTableView/QSqlTableModel
Отправлено: GreatSnake от Март 01, 2011, 09:18
Цитировать
пришлось создать 2 TableView, т.к. QTabWidget не хотел создавать 2 таба с одинаковыми виджетами.
См. QTabBar.


Название: Re: QTabWidget и QTableView/QSqlTableModel
Отправлено: chu от Март 01, 2011, 17:19
Цитировать
пришлось создать 2 TableView, т.к. QTabWidget не хотел создавать 2 таба с одинаковыми виджетами.
См. QTabBar.
переписал с QTabBar, спасибо :)
внимательно смотрим в текст. Каждый раз НА ОДНОЙ И ТОЙ ЖЕ глобально описаной переменной заново создается новая модель и табвиджет
не совсем понял что ты хотел сказать... при переключении по табам нужно по новой создавать модель?


Название: Re: QTabBar и QTableView/QSqlTableModel
Отправлено: chu от Март 04, 2011, 09:52
осознал нелепость своего изначального подхода :)
все переделал: теперь 2 модели, 1 вью, 0 проблем.

подскажите пожалуйста как убрать пробел между QTabBar и QTableView
сейчас компаную так:
Код:
    QGridLayout *lay = new QGridLayout;
    lay->addWidget(tabBar, 0, 0);
    lay->addWidget(checkTableView, 1, 0, 4, 1);
    lay->addWidget(deleteButton, 1, 1, 1, 1);
    lay->addWidget(closeButton, 3,1,1,1);
    lay->setRowStretch(2,10);
    setLayout(lay);


Название: Re: QTabBar и QTableView/QSqlTableModel
Отправлено: GreatSnake от Март 04, 2011, 10:20
Код
C++ (Qt)
lay->setSpacing( 0 );


Название: Re: QTabBar и QTableView/QSqlTableModel
Отправлено: chu от Март 04, 2011, 10:49
Код
C++ (Qt)
lay->setSpacing( 0 );
не совсем то что мне нужно, так остается линия между виджетами.
хочется вид как в QTabWidget


Название: Re: QTabBar и QTableView/QSqlTableModel
Отправлено: GreatSnake от Март 04, 2011, 10:54
Цитировать
подскажите пожалуйста как убрать пробел между QTabBar и QTableView
Что просил, то и посоветовал :)

Цитировать
не совсем то что мне нужно, так остается линия между виджетами.
хочется вид как в QTabWidget
Код
C++ (Qt)
tabBar->setDrawBase(false);


Название: Re: QTabBar и QTableView/QSqlTableModel
Отправлено: chu от Март 04, 2011, 12:22
 :) тогда новый вопрос: Как у вьюхи верхнюю грань убрать?
хотя... это тоже не выход. нужно что-то с фоном сделать


Название: Re: QTabBar и QTableView/QSqlTableModel
Отправлено: GreatSnake от Март 04, 2011, 12:26
Что такое "верхняя грань вьюхи"?


Название: Re: QTabBar и QTableView/QSqlTableModel
Отправлено: chu от Март 04, 2011, 12:36
вложил 2 файла для примера. 1 - QTabWidget, 2- QTabBar
как сделать тот что с баром похожим на тот что с виджетом?


Название: Re: QTabBar и QTableView/QSqlTableModel
Отправлено: GreatSnake от Март 04, 2011, 12:45
Обычными средствами никак, т.к. именно QTabWidget отрисовывает такую рамку.


Название: Re: QTabBar и QTableView/QSqlTableModel
Отправлено: chu от Март 04, 2011, 13:02
Ясно, оставлю как есть.
Спасибо за помощь, GreatSnake