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

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

Страниц: 1 2 [3] 4 5 ... 7   Вниз
  Печать  
Автор Тема: QTableWidget или QAbstractTableModel &QTableView  (Прочитано 57337 раз)
daimon
Гость
« Ответ #30 : Ноябрь 23, 2009, 22:48 »

С помощью диалога задается количество колонок и строк
Есть также диалог заполнения таблицы x от и до  шаг по х
и формула для расчёта
« Последнее редактирование: Ноябрь 23, 2009, 22:51 от daimon » Записан
spectre71
Гость
« Ответ #31 : Ноябрь 23, 2009, 22:56 »

С помощью диалога задается количество колонок и строк

Это понятно

Есть также диалог заполнения таблицы x от и до  шаг по х
и формула для расчёта

А это не очень.

Это что-то наподобии электронных таблиц, например "Microsoft Excel" ?


Записан
daimon
Гость
« Ответ #32 : Ноябрь 23, 2009, 22:58 »

программу advanced grapher видел, скачай маленькая вот есть то что мне надо
« Последнее редактирование: Ноябрь 23, 2009, 23:02 от daimon » Записан
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #33 : Ноябрь 23, 2009, 23:20 »

Я думаю кое-что полезное можно найти в исходниках SciDAVis
Записан

Юра.
spectre71
Гость
« Ответ #34 : Ноябрь 23, 2009, 23:55 »

Я думаю кое-что полезное можно найти в исходниках SciDAVis

Вот тебе простой пример c огромной таблицей 5000000 x 8000000 : Улыбающийся

.h
Код
C++ (Qt)
class MySrcData  {
 public:
   int myCountRows(void)   {return 5000000;}
   int myCountColumn(void) {return 8000000;}    
   QString getMyDisplayString(int row, int column)  {
     if(row == column) {return QString("Middle");}
     return  QString(QString("Value = ") + QString::number(row+column));
   }
 
};
 
class MyModel : public QAbstractItemModel {
   Q_OBJECT
protected:
  MySrcData* SrcData;
public:
 
 MyModel (MySrcData* Data, QObject *parent = 0);
 virtual ~MyModel ();
 
 virtual QModelIndex parent(const QModelIndex &child) const;
 virtual bool hasChildren(const QModelIndex &parent) const;
 
 virtual int rowCount(const QModelIndex &parent = QModelIndex()) const;
 virtual int columnCount(const QModelIndex &parent = QModelIndex()) const;
 
 virtual QModelIndex index(int row, int column, const QModelIndex &parent = QModelIndex()) const;
 virtual QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const;
 virtual Qt::ItemFlags flags(const QModelIndex &index) const;
};      
 

.cpp
Код
C++ (Qt)
MyModel ::MyModel (MySrcData* Data, QObject *parent)  : QAbstractItemModel (parent)
{
 SrcData = Data;
}
 
MyModel ::~MyModel ()
{
 
}
 
QModelIndex MyModel::parent(const QModelIndex & /*child*/) const {
 return QModelIndex();
}
 
bool MyModel::hasChildren(const QModelIndex &parent) const {
 if (parent.model() == this || !parent.isValid()) {
   return rowCount(parent) > 0 && columnCount(parent) > 0;
 }    
 return false;
}
 
int MyModel::rowCount(const QModelIndex &parent) const {
 if (parent.isValid()) {return 0;}
 return SrcData->myCountRows();
}
 
int MyModel::columnCount(const QModelIndex &parent) const {
 if (parent.isValid()) {return 0;}
 return SrcData->myCountColumn();
}
 
 
QModelIndex MyModel::index(int row, int column, const QModelIndex &parent) const {
 if (parent.isValid())                                   {return QModelIndex();}
 if (row    < 0 || row    >= SrcData->myCountRows())   {return QModelIndex();}
 if (column < 0 || column >= SrcData->myCountColumn()) {return QModelIndex();}
 
 return createIndex(row, column, (void*)NULL);
}                                                
 
 
QVariant MyModel::data(const QModelIndex &index, int role) const {
 if (!index.isValid())                                                  {return QVariant();}
 if (index.row()    < 0 || index.row()    >= SrcData->myCountRows())    {return QVariant();}
 if (index.column() < 0 || index.column() >= SrcData->myCountColumn())  {return QVariant();}
 
 if (role == Qt::DisplayRole)             {
   return SrcData->getMyDisplayString(index.row(), index.column());
 } else if(role == Qt::BackgroundColorRole) {
   if(index.row() == index.column()) {return QVariant();}
   if(index.row() <= index.column()) {return QVariant(QColor(Qt::green));}
   return QVariant(QColor(Qt::yellow));
 }
 
 return QVariant();
}          
 
Qt::ItemFlags MyModel::flags(const QModelIndex &index) const {
 return Qt::ItemIsEnabled | Qt::ItemIsSelectable;
}              
 

mainwindow конструктор

Код
C++ (Qt)
{
 ui.setupUi(this);
 
 MySrcData* Data = new MySrcData();                    
 MyModel* Model = new MyModel(Data);
 ui.tableView->setModel(Model);
}
 

Не забудь в дизайнере кинуть QTableView на форму!
Записан
daimon
Гость
« Ответ #35 : Ноябрь 24, 2009, 00:35 »

Я думаю кое-что полезное можно найти в исходниках SciDAVis

Вот тебе простой пример c огромной таблицей 5000000 x 8000000 : Улыбающийся

.h
Код
C++ (Qt)
class MySrcData  {
 public:
   int myCountRows(void)   {return 5000000;}
   int myCountColumn(void) {return 8000000;}    
   QString getMyDisplayString(int row, int column)  {
     if(row == column) {return QString("Middle");}
     return  QString(QString("Value = ") + QString::number(row+column));
   }
 
};
 
class MyModel : public QAbstractItemModel {
   Q_OBJECT
protected:
  MySrcData* SrcData;
public:
 
 MyModel (MySrcData* Data, QObject *parent = 0);
 virtual ~MyModel ();
 
 virtual QModelIndex parent(const QModelIndex &child) const;
 virtual bool hasChildren(const QModelIndex &parent) const;
 
 virtual int rowCount(const QModelIndex &parent = QModelIndex()) const;
 virtual int columnCount(const QModelIndex &parent = QModelIndex()) const;
 
 virtual QModelIndex index(int row, int column, const QModelIndex &parent = QModelIndex()) const;
 virtual QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const;
 virtual Qt::ItemFlags flags(const QModelIndex &index) const;
};      
 

.cpp
Код
C++ (Qt)
MyModel ::MyModel (MySrcData* Data, QObject *parent)  : QAbstractItemModel (parent)
{
 SrcData = Data;
}
 
MyModel ::~MyModel ()
{
 
}
 
QModelIndex MyModel::parent(const QModelIndex & /*child*/) const {
 return QModelIndex();
}
 
bool MyModel::hasChildren(const QModelIndex &parent) const {
 if (parent.model() == this || !parent.isValid()) {
   return rowCount(parent) > 0 && columnCount(parent) > 0;
 }    
 return false;
}
 
int MyModel::rowCount(const QModelIndex &parent) const {
 if (parent.isValid()) {return 0;}
 return SrcData->myCountRows();
}
 
int MyModel::columnCount(const QModelIndex &parent) const {
 if (parent.isValid()) {return 0;}
 return SrcData->myCountColumn();
}
 
 
QModelIndex MyModel::index(int row, int column, const QModelIndex &parent) const {
 if (parent.isValid())                                   {return QModelIndex();}
 if (row    < 0 || row    >= SrcData->myCountRows())   {return QModelIndex();}
 if (column < 0 || column >= SrcData->myCountColumn()) {return QModelIndex();}
 
 return createIndex(row, column, (void*)NULL);
}                                                
 
 
QVariant MyModel::data(const QModelIndex &index, int role) const {
 if (!index.isValid())                                                  {return QVariant();}
 if (index.row()    < 0 || index.row()    >= SrcData->myCountRows())    {return QVariant();}
 if (index.column() < 0 || index.column() >= SrcData->myCountColumn())  {return QVariant();}
 
 if (role == Qt::DisplayRole)             {
   return SrcData->getMyDisplayString(index.row(), index.column());
 } else if(role == Qt::BackgroundColorRole) {
   if(index.row() == index.column()) {return QVariant();}
   if(index.row() <= index.column()) {return QVariant(QColor(Qt::green));}
   return QVariant(QColor(Qt::yellow));
 }
 
 return QVariant();
}          
 
Qt::ItemFlags MyModel::flags(const QModelIndex &index) const {
 return Qt::ItemIsEnabled | Qt::ItemIsSelectable;
}              
 

mainwindow конструктор

Код
C++ (Qt)
{
 ui.setupUi(this);
 
 MySrcData* Data = new MySrcData();                    
 MyModel* Model = new MyModel(Data);
 ui.tableView->setModel(Model);
}
 

Не забудь в дизайнере кинуть QTableView на форму!

За пример большое спасибо!!!!!!!!!!!!!!!!!!!
Записан
daimon
Гость
« Ответ #36 : Ноябрь 24, 2009, 00:44 »

В модели можна определять функции SetRowCount() SetColumnCount()?
Просто я хочу свой таьлвиджет переписать под модель

Почему при редактировании ячейки почему-то открывается спинбокс QAbstractTableModel?
« Последнее редактирование: Ноябрь 24, 2009, 01:01 от daimon » Записан
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #37 : Ноябрь 24, 2009, 01:55 »

>>В модели можна определять функции SetRowCount() SetColumnCount()?
какие нужно функции такие и определяй

>>Почему при редактировании ячейки почему-то открывается спинбокс QAbstractTableModel?
Выделенное совершенно не понятно
Записан

Юра.
daimon
Гость
« Ответ #38 : Ноябрь 24, 2009, 02:00 »

>>В модели можна определять функции SetRowCount() SetColumnCount()?
какие нужно функции такие и определяй

>>Почему при редактировании ячейки почему-то открывается спинбокс QAbstractTableModel?
Выделенное совершенно не понятно
модель создана на базе QAbstractTableModel
Записан
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #39 : Ноябрь 24, 2009, 02:01 »

daimon, с примером  Spectre по осторожнее. там данные не хранятся, они вычисляются в зависимости от индекса строки и столбца
Записан

Юра.
spectre71
Гость
« Ответ #40 : Ноябрь 24, 2009, 02:01 »

Почему при редактировании ячейки почему-то открывается спинбокс?

По-умолчанию.
Все что нужно можно сделать! Но надо почитать доку!
Записан
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #41 : Ноябрь 24, 2009, 02:03 »

>>модель создана на базе QAbstractTableModel
Если модель создадана на основе "А" это не значит, что спинбокс "А"
Спинбокс к модели вообще никакого отношения не имеет, это просто виджет редактор.
Записан

Юра.
daimon
Гость
« Ответ #42 : Ноябрь 24, 2009, 02:04 »

#include <QtGui>

// ======================================================================
class TableModel : public QAbstractTableModel {
private:
    int                          m_nRows;
    int                          m_nColumns;
    QHash<QModelIndex, QVariant> m_hash;

public:
    TableModel(int nRows, int nColumns, QObject* pobj = 0)
        : QAbstractTableModel(pobj)
        , m_nRows(nRows)
        , m_nColumns(nColumns)
    {
    }
  
    QVariant data(const QModelIndex& index, int nRole) const
    {
        if (!index.isValid()) {
            return QVariant();
        }
       // QString str =
         //  QString("%1,%2").arg(index.row() + 1).arg(index.column() + 1);
        return (nRole == Qt::DisplayRole || nRole == Qt::EditRole)
               ? m_hash.value(index, QVariant())
               : QVariant();
    }
    
    bool setData(const QModelIndex& index,
                 const QVariant&    value,
                 int                nRole
                )
    {
        if (index.isValid() && nRole == Qt::EditRole) {
            m_hash[index] = value.toString();
            emit dataChanged(index, index);
            return true;
        }
        return false;
    }

    int rowCount(const QModelIndex&) const
    {
        return m_nRows;
    }

    int columnCount(const QModelIndex&) const
    {
        return m_nColumns;
    }

    Qt::ItemFlags flags(const QModelIndex& index) const
    {
        Qt::ItemFlags flags = QAbstractTableModel::flags(index);
        return index.isValid() ? (flags | Qt::ItemIsEditable)
                               : flags;
    }
};

// ----------------------------------------------------------------------
int main(int argc, char *argv[])
{
    QApplication app(argc, argv);
QTableView tableView;
   int rows=20000,columns=20000;
   TableModel model(rows, columns);
   for(int i = 0; i < rows; i++)
            for(int j = 0; j < columns; j++)
            {
               QModelIndex index = model.index(i, j);
               model.setData(index, i, Qt::EditRole);
                   tableView.setModel(&model);
    tableView.show();

               app.processEvents();
            }
    

    
    tableView.setModel(&model);
    tableView.show();

    return app.exec();
}

Очень медленно добавляются элементы как исправить?
« Последнее редактирование: Ноябрь 24, 2009, 02:06 от daimon » Записан
daimon
Гость
« Ответ #43 : Ноябрь 24, 2009, 02:34 »

Как реализовать insertColumn(...)
Стандартный вставляет колонку в конец, а мне нужно туда куда указал с помощью параметра
Записан
spectre71
Гость
« Ответ #44 : Ноябрь 24, 2009, 02:43 »

Ну и начудил!

Добавляем метод:

QString getKey(int row, int column) {
  QString key(QString::number(index.row()));
  key.append(".");
  key.append(QString::number(index.column()));
  return key;
}

Исправляем:

1)
//QHash<QModelIndex, QVariant> m_hash;
QHash<QString, QVariant> m_hash;
2)
//return (nRole == Qt::DisplayRole || nRole == Qt::EditRole)
//               ? m_hash.value(index, QVariant())
//               : QVariant();
if(nRole == Qt::DisplayRole || nRole == Qt::EditRole) {
  QString key(getKey(index.row(), index.column()));
  if(hash.contains(key)) {return m_hash.value(key);}
  else                   {return index.row();}
}
return QVariant();

3)
//m_hash[index] = value.toString();
  QString key(getKey(index.row(), index.column()));
  m_hash[key] = value;

4) Убираем вложенный цикл заполнения
//for(int i = 0; i < rows; i++)
//            for(int j = 0; j < columns; j++)
//            {
//               QModelIndex index = model.index(i, j);
//               model.setData(index, i, Qt::EditRole);
//                   tableView.setModel(&model);
//    tableView.show();
//
//               app.processEvents();
//            }

Теперь храним только то что изменили, а начальный вид идентичен тому что был. И никаких тормозов.
« Последнее редактирование: Ноябрь 24, 2009, 02:47 от Spectre » Записан
Страниц: 1 2 [3] 4 5 ... 7   Вверх
  Печать  
 
Перейти в:  


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