crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в данную темуНачать новую тему
> QTableView + QSqlTableModel показывает пустое белое окошко
genusatplay
  опции профиля:
сообщение 15.12.2008, 0:44
Сообщение #1


Студент
*

Группа: Участник
Сообщений: 50
Регистрация: 8.11.2008
Пользователь №: 416

Спасибо сказали: 0 раз(а)




Репутация:   0  


я чтото никак в толк немогу взять почему неработает showdoc() показывает пустое белое окошко
подскажите плиз что нетак написал?
MAINWINDOW_H
#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QtSql>
#include <QtGui>


class MainWindow : public QMainWindow
{
Q_OBJECT

public:
MainWindow();

private slots:
void connectDb();
void disconnectDb();
void showDoc();

private:
void createMenus();

QSqlDatabase db;

QAction *exitAction;
QAction *connectAction;
QAction *disconnectAction;
QAction *showdocsAction;

QMenu *dbMenu;
QMenu *docMenu;

QSqlTableModel docs;
QTableView docsview;

};
#endif

MainWindow.cpp

#include "mainwindow.h"

MainWindow::MainWindow()
{
setWindowTitle(tr("Database editor"));
createMenus();

}
void MainWindow::createMenus()
{
dbMenu = menuBar()->addMenu(QObject::tr("&Database"));
connectAction = dbMenu->addAction(tr("&Connect"));
connect(connectAction,SIGNAL(triggered()),this,SLOT(connectDb()));

disconnectAction = dbMenu->addAction(tr("&Disconnect"));
disconnectAction->setDisabled(true);
connect(disconnectAction,SIGNAL(triggered()),this,SLOT(disconnectDb()));

dbMenu->addSeparator();
exitAction = dbMenu->addAction(QObject::tr("E&xit"));
exitAction->setShortcut(QKeySequence(QObject::tr("Ctrl+Q")));
exitAction->setStatusTip(QObject::tr("Exit programm"));
connect(exitAction,SIGNAL(triggered()),qApp,SLOT(quit()));

docMenu = menuBar()->addMenu(tr("Documents"));
showdocsAction = docMenu->addAction(tr("Show Documents"));
showdocsAction->setDisabled(true);
connect(showdocsAction,SIGNAL(triggered()),this,SLOT(showDoc()));

}
void MainWindow::connectDb()
{
db = QSqlDatabase::addDatabase("QSQLITE");
db.setDatabaseName("docs.sqlite");
if (db.open()){
disconnectAction->setEnabled(true);
showdocsAction->setEnabled(true);
connectAction->setDisabled(true);
} else {
QMessageBox::warning(this,"Database Error",db.lastError().text());
}

}
void MainWindow::disconnectDb()
{
db.close();
if ( !db.isOpen() ){
connectAction->setEnabled(true);
disconnectAction->setDisabled(true);
showdocsAction->setDisabled(true);
} else {
QMessageBox::warning(this,"Database Error","Can't disconnected from database");
}


}
void MainWindow::showDoc()
{
docs.setTable("elements");
docs.setSort(0,Qt::AscendingOrder);
docs.select();
docsview.setModel(&docs);
docsview.setWindowTitle(tr("List of documents"));
docsview.resizeColumnsToContents();
docsview.show();
}

посмотрел несколько примеров из книги... и чета ненашел каким образом коннектится БД с qsqltablemodel
там после открытия бд сразу идет выборка в таблицу и работает видимо, но в тех примерах все в 1ой процедуре делается

QSqlTableModel::QSqlTableModel ( QObject * parent = 0, QSqlDatabase db = QSqlDatabase() )
Creates an empty QSqlTableModel and sets the parent to parent and the database connection to db. If db is not valid, the default database connection will be used.
ну у меня вроде 1 коннект.. так что все должно работать но неработает (

Сообщение отредактировал Litkevich Yuriy - 31.1.2009, 12:42
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
SABROG
  опции профиля:
сообщение 15.12.2008, 1:18
Сообщение #2


Профессионал
*****

Группа: Участник
Сообщений: 1207
Регистрация: 8.12.2008
Из: Russia, Moscow
Пользователь №: 446

Спасибо сказали: 229 раз(а)




Репутация:   34  


Скорее всего проблема в том, что QSqlTable надо создавать после QSqlDatabase. Т.к. на момент создания QSqlTable нет ни одного соединения с базой и конструктор не находит default connection.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
genusatplay
  опции профиля:
сообщение 15.12.2008, 1:29
Сообщение #3


Студент
*

Группа: Участник
Сообщений: 50
Регистрация: 8.11.2008
Пользователь №: 416

Спасибо сказали: 0 раз(а)




Репутация:   0  


Цитата(SABROG @ 15.12.2008, 1:18) *
Скорее всего проблема в том, что QSqlTable надо создавать после QSqlDatabase. Т.к. на момент создания QSqlTable нет ни одного соединения с базой и конструктор не находит default connection.

я сразу не понял это.. чет забыл что создаю так "qsqltablemodel docs;"
вот и была трабла..

и еще вопрос.. а можно добавлять новые элементы в талблицу при помощи qsqltablemodel или ему подобных?

Сообщение отредактировал genusatplay - 15.12.2008, 3:39
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 15.12.2008, 7:29
Сообщение #4


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Цитата(genusatplay @ 15.12.2008, 4:29) *
и еще вопрос.. а можно добавлять новые элементы в талблицу при помощи qsqltablemodel или ему подобных?
можно, я соорудил пару виджетов и их везде пользую:
1) TableEditor
2) RelationTableEditor
тут: Прикрепленный файл  sqleditors.zip ( 7.66 килобайт ) Кол-во скачиваний: 546


пользую так:
1)
интерфейс наследника TableEditor
#ifndef TR_EDITOR_H
#define TR_EDITOR_H

#include "tableeditor.h"

/*! \class TReditor
*    \brief Класс "Редактор трансформаторов".
*
*/
class TReditor : public TableEditor
{
    //Q_OBJECT

public:
    static const QString U;
    static const QString I;
    
   /*!    \brief Конструктор класса
    *    \param    db - имя соединения с БД.
    *    \param    parent - указатель на родительский виджет,
    *    по умолчанию равен нулю.
    *    \param    tr_type - тип трансформаторов, например, тока или напряжения.    
    *    \sa TableEditor()
    */
    TReditor(const QSqlDatabase &db, const QString &tr_type, QWidget *parent = 0);


};

#endif //TR_EDITOR_H

реализация наследника TableEditor
#include <QtGui>
#include <QtSql>

#include <QTextCodec>
#include "tr_editor.h"
/* */
const QString TReditor::U = "REFTRU";
const QString TReditor::I = "REFTRI";

TReditor::TReditor(const QSqlDatabase &db, const QString &tr_type, QWidget *parent)
    : TableEditor(db, tr_type, parent)
{

    colHide(0);    // Прячим ID
    setHeader(1,tr("Название"));
    setHeader(2,tr("К тр-ции"));
    //setEditor(2,);    // установим виджет-редактор
    setHeader(3,tr("Марка"));
    setHeader(4,tr("Произв."));
    setHeader(5,tr("Дата изгот."));
    //setEditor(5,);    // установим виджет-редактор
    colHide(6);    // Прячим Дату регистрации в БД
    selectData();

}

2)
интерфейс наследника RelationTableEditor
#ifndef USEREDITOR_H
#define USEREDITOR_H

#include "relationtableeditor.h"

class QSqlDatabase;

/*! \class UserEditor
*    \brief Класс "Редактор пользователей".
*
*/
class UserEditor : public RelationTableEditor
{
    //Q_OBJECT

public:
   /*!    \brief Конструктор класса
    *    \param    db - мя соединения с БД.
    *    \param *parent - указатель на родительский виджет,
    *    по умолчанию равен нулю.
    *    \sa RelationTableEditor()
    */
    UserEditor(const QSqlDatabase &db, QWidget *parent = 0);


};

#endif //USEREDITOR_H

реализация наследника RelationTableEditor
#include <QtGui>
#include <QtSql>

#include <QTextCodec>
#include "usereditor.h"

UserEditor::UserEditor(const QSqlDatabase &db, QWidget *parent)
    : RelationTableEditor(db, "APPUSER", parent)
{
    colHide(0);    // Прячим ID
    setHeader(1,tr("Логин"));
    setHeader(2,tr("Пароль"));
    setHeader(3,tr("Группа"));
    setRelation(3,"APPGROUP","F_ID","F_GROUP"); // установим связь с другой таблицей
    setHeader(4,tr("Имя"));
    setHeader(5,tr("Фамилия"));

    selectData();
    //rowHide(0); // Прячим пользователя root    
}
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 29.3.2024, 10:37