QTableWidget or QTableView
-
You said the nested class should have the Q_Object, but the compiler says it is not supported for nested classes
-
I don't think I said that, but you probably don't need it either. Note that you could even keep the whole declaration of CONTACTMODEL out of the header. Just forward declare it, and put all of it in your cpp file or use a separate header file for it. That way, you can change it however you want and classes including PLAYERMODEL's header won't need to recompile.
-
I think i keep it as nested class sofar, a couple of posts before you said that i need more functions to keep the view updated if something in the playerholder changes. What function would that be?
-
The class itself can still be nested, it is just about the place where you declare it. The methods you're going to need to access are the protected beginInsertRows, endInsertRows, beginRemoveRows, and endRemoveRows as well as the itemsChanged signal. These are needed to make the model and the connected views react properly to modifications in your data.
-
I tried to forward declare the class, but i just failed:( Nerver did forward declaration before and google didnt help. At the moment i just added an update() function to CONTACTMODEL and call it after create,modify,delete functions.
@void update()
{
this.reset();
}@and it works:)
-
That's a nice hack, but please don't use it in production code. Instead, learn how to properly update your model.
-
You talked about the forward declaration before, I think i need use it because nested classes arent allowed to use SLOTS and SIGNALS. Can you explain me how to forward declare?
-
Can anybody explain how to forward declar the nested class?
-
[quote author="DaFranzl" date="1344438774"]Can anybody explain how to forward declar the nested class?[/quote]
Moderators note:
Please practise some patience. It is considdered rude to "up" your topic within a day or two, some say a week. -
bq. Can anybody explain how to forward declar the nested class?
It's pretty straightforward stuff. Google can point you to a ton of good information. If you need more clarification, we'd be glad to help.
-
Sorry for the up-post, but I googled a lot and visited 2 pages of links but I still dont know how to forward declare a nested class. I already tried this:
@
#include <QtCore>
#include <player.h>
#include <datasource.h>
#include <contactmodel.h>class PLAYERHOLDER
{public:
static PLAYERHOLDER* getInstance();
void createPlayer(PLAYER player);
void updatePlayer(int id);
void deletePlayer(int id);
PLAYER findPlayer(int id);
void loadPlayers(int teamid);QAbstractItemModel* model() ;
private:
PLAYERHOLDER();
static PLAYERHOLDER thePlayerholder;
QHash<int, PLAYER> playerlist;
DATASOURCE *datasource;
mutable CONTACTMODEL *m_model;
};
@@
#include <playerholder.h>class PLAYERHOLDER;
class CONTACTMODEL : public QAbstractTableModel
{
public:
explicit CONTACTMODEL(PLAYERHOLDER* holder);int rowCount( const QModelIndex &parent ) const; int columnCount( const QModelIndex &parent ) const; QVariant data( const QModelIndex &index, int role ) const; QVariant headerData( int section, Qt::Orientation orientation, int role ) const; void update(); private: static PLAYERHOLDER* m_playerHolder; };@
But that didnt work :(
-
How about:
@
#include <QtCore>
#include <player.h>
#include <datasource.h>
#include <contactmodel.h>
class QAbstractItemModel;class PLAYERHOLDER
{
private:
class CONTACTMODEL; //forward declarationpublic:
static PLAYERHOLDER* getInstance();
void createPlayer(PLAYER player);
void updatePlayer(int id);
void deletePlayer(int id);
PLAYER findPlayer(int id);
void loadPlayers(int teamid);QAbstractItemModel* model() ;
private:
PLAYERHOLDER();
static PLAYERHOLDER thePlayerholder;
QHash<int, PLAYER> playerlist;
DATASOURCE *datasource;
mutable CONTACTMODEL *m_model;
};
@@
//in PLAYERHOLDER.cpp#include <QAbstractTableModel>
class PLAYERHOLDER::CONTACTMODEL : public QAbstractTableModel
{
public:
explicit CONTACTMODEL(PLAYERHOLDER* holder)
: QAbstractItemModel()
{ //implement here }int rowCount( const QModelIndex &parent ) const { // implement here } // same for other methods private: PLAYERHOLDER* m_playerHolder; // NO need to make it static };
//implement PLAYERHOLDER here under
@
-
Ok, so I forward declared the class, but you said i have to define the signal datachanged, the problem i have is that nested classes aren't allowed to have signal and slots. So how can i implement it? Also if I try to add Q_Object macro into CONTACTMODEL, I get compile errors about unresolved extern symbol metaObject.
-
No, I did not say that. QAbstractItemModel already defines it, you just need to make sure the signal is emitted when needed. So, you don't need moc or Q_OBJECT in the class.
-
Ok, I tryed to implement the functions insertRows() and removeRows(). I have an example from my book:
@bool TableModel::insertRows(int row, int count, const QModelIndex&)
{
beginInsertRows(QModelIndex(), row, row + count - 1);
for (int i = 0; i < count; ++i)
zipcodes.insert(row, ZipcodeItem());
endInsertRows();
return true;
}@But i dont think this one would work, cause it inserts items into the store. But in my case it is like, the function createPlayer() is called and then the model needs to update. Also the update function, it is called then it needs to find out where the player is stored and then edits it. But I have no idea after reading this book how to implement this with my api.
-
the best choice is QStandardItemModel (or QAbstractTableModel) + QTableView :
the model : to store and control data
the view : to display the datayou can also download this example : http://www.iissam.com/sources/codes.php (AHP method)
-
Ok, i think u didnt read the conversation before;) I got a nested QAbstractTableModel class
-
[quote author="DaFranzl" date="1344544630"]Ok, I tryed to implement the functions insertRows() and removeRows(). I have an example from my book:
@bool TableModel::insertRows(int row, int count, const QModelIndex&)
{
beginInsertRows(QModelIndex(), row, row + count - 1);
for (int i = 0; i < count; ++i)
zipcodes.insert(row, ZipcodeItem());
endInsertRows();
return true;
}@But i dont think this one would work, cause it inserts items into the store. But in my case it is like, the function createPlayer() is called and then the model needs to update. Also the update function, it is called then it needs to find out where the player is stored and then edits it. But I have no idea after reading this book how to implement this with my api.[/quote]
This code does the reverse of what you want. What you want is your store notifying your model, but the code you show is an implementation is allowing chaning your store through your model. Both are valid use cases, but they are not the same. However, the basics of what happens is the same: call beginInsertRows() directly before you add to your data store, and endInsertRows() directly after. Only, instead of doing that from the insertRows method of your CONTACTMODEL, you trigger it from your PLAYERHOLDER class' createPlayer implementation.
-
Should i call the insertRows method from createPlayer and at inserrRows() just call beginInsertRows() and endInsertRows()?
-
Did you try reading the documentation for these methods in [[doc:QAbstractItemModel]]?