C++, Qt, Базы данных

Отображение данных выборки в виджете QTableView

Предположим, что на форме расположен объект класса QStackedWidget, на страницах которого расположены объекты QTableView, отображающие различные данные. В один момент времени данные будут отображаться только в одном из виджетов QTableView (по одному на страницу stacked widget). Объявим модель для данных типа QSqlQueryModel:

private:
    Ui::MainWindow *ui;
    QSqlQueryModel *model;

Определение модели происходит следующим образом (на примере для одной страницы):

void MainWindow::showTableView1()
{
    if (model != 0)
        model->clear();
    else
        model = new QSqlQueryModel;
    model->setQuery(firstQuery());
    if (model->lastError().isValid())
        qDebug() << model->lastError().text();
    qDebug() << "query:" << model->query().lastQuery();

    QStringList columns;

    columns.push_back(tr("Колонка1"));
    columns.push_back(tr("Колонка2"));
    columns.push_back(tr("Колонка3");
    columns.push_back(tr("Колонка4"));
	/*или можно так:
	columns << tr("Колонка1") << tr("Колонка2")
			<< tr("Колонка3") << tr("Колонка4");
	*/    
	modelToTable(0, columns);
}

Здесь firstQuery() — функция, которая возвращает текст запроса данных для отображения на данной странице №0. Тут можно вставить любой запрос, например «select id, name_, date_, count_ from product».

В порядке следования колонок заполняем список строк своими наименованиями колонок. Если не присваивать свои названия, то отображаться будут те, с которыми создавалась таблица в СУБД. Вызываем функцию «построения» данных в виджете tableView:

void MainWindow::modelToTable(uint number, QStringList columns)
{
    for (int i = 0; i < columns.size(); ++i)
        model->setHeaderData(i, Qt::Horizontal, tr("%1").arg(columns[i]));
    QTableView *view;
    switch(number) {
    case 0:
        view = ui->tableView1;
        break;
    case 1:
        view = ui->tableView2;
        break;
    case 2:
        view = ui->tableView3;
        break;
    }
    view->setModel(model);
	//этот цикл нужен только в том случае, если названия колонок в 
	//списке переданы для видимых колонок, и они все находятся в начале
	//выборки данных, а остальные - невидимые
    for (int i = columns.size(); i < model->columnCount(); ++i)
        view->setColumnHidden(i, true);
    view->resizeColumnsToContents();
    view->setSelectionMode(QAbstractItemView::SingleSelection);
    view->setSelectionBehavior(QAbstractItemView::SelectRows);
    view->setEditTriggers(QAbstractItemView::NoEditTriggers);
}

Отображение данных выборки в виджете QTableView: 3 комментария

Оставьте своё мнение...

Этот сайт использует Akismet для борьбы со спамом. Узнайте как обрабатываются ваши данные комментариев.