ich möchte in mein Programm MVC einbringen, habe das vorher noch nie gemacht.
Momentan habe ich eine Header und eine Main und eine cpp in der der ganze Code steht.
Ich habe schon rumprobiert und mir sämtliches über MVC durchgelesen und an kleinen Beispielprogrammen geübt, da ging alles gut.
Aber bei meinem Programm weiß ich nicht recht wie ich anfangen soll. Ich wollte es mit einem QAbstractTableModel und einer QMap machen.
Wenn man auf meinen Button klickt, gehen imoment einfach die aktuellen Strings aus den QTextEdit feldern in die Tabelle, vorher werden sie überprüft ob es sie schon gibt oder nicht.
Nun soll wenn man auf den Button klickt, von meinem Controller eine add(name,value) an mein Model aufgerufen werden. das Model soll dann die Methoden haben isContained(name,value) ( ob es schon existiert oder nicht) , addToMap(name,value) die es zur Map hinzufügt) und notify() ( die benachrichtigt ) dann die update() Methode von meinem Controller ( oder der View ? ) aufruft. Die/Der sich dann von der QMap getData() die Inhalte der QMap holt und dann mit setItem() setzt.
Soweit ist der Plan, aber ich weiß irgendwie nicht genau wie ich das Implementieren soll. Ich denke ich brauche nur 2 cpp's , einmal für das Model und einmal für den Controller/View kann man das so machen ?
Kann mir jemand einen groben Tipp geben wie ich das implementieren aufbauen soll ?
Ich denke ich muss die MyTableModel::data , columnCount,rowCount Methoden überschreiben.
Bitte sagt mir nun nicht das ich mir das Prinzip nochmal angucken soll, ich lese die ganze Zeit etwas darüber und habe in meinem Buch "Patterns kompakt" von Karl Eilebracht auch schon das Kapitel zu MVC gelesen.
Ich verstehe nur grade nicht wie ich es in meinem Beispiel aufbauen muss.
hier meine cpp in der noch alles zusammen ist. Ich habe schon einiges ausprobiert, aber es klappte nicht. Ich denke es lag einfach daran, das ich es falsch aufgebaut habe, darum sind die Fehler hier wohl ehr irrelevant.
Code: Alles auswählen
#include "Tabelle.h"
Tabelle::Tabelle()
{
strname = "strname";
strvalue = "strvalue";
coucount = 0;
cou = 0;
}
void Tabelle::init()
{
// Baut erstmal alles
Tabelle tabellen;
table = new QTableWidget();
lblname = new QLabel ("Name: ", this );
lblvalue = new QLabel("Value",this);
txtname = new QLineEdit();
txtvalue = new QLineEdit();
QPushButton* btnaddtotable = new QPushButton( "Add to Table", this);
QVBoxLayout *layout = new QVBoxLayout (this);
//setzt es auf die Spalten und Zeilen die am Anfang drin sein sollen
table->setRowCount( 10 );
table->setColumnCount( 2 );
// Labels setzen von der tabelle
QStringList hLabels, vLabels;
hLabels << "Name" << "Value" ;
table->setHorizontalHeaderLabels( hLabels );
lblname->setGeometry (40 , 50 , 150 , 60);
lblname->setFont(QFont("Times", 10, QFont::Bold));
lblvalue->setGeometry (40 , 50 , 250 , 60);
lblvalue->setFont(QFont("Times", 10, QFont::Bold));
btnaddtotable->setGeometry(50,20,100,40);
this->setGeometry(800,400,800,650);
//label und felder zum Layout hinzufügen ( reihnfolge in der sie dann auch zu sehen sind )
layout->addWidget(lblname);
layout->addWidget(txtname);
layout->addWidget(lblvalue);
layout->addWidget(txtvalue);
layout->addWidget(btnaddtotable);
layout->addWidget(table);
// macht den Indicator sichtbar
table->horizontalHeader()->setSortIndicatorShown(true);
// macht sortieren möglich
table->setSortingEnabled(true);
// SIgnal / slot mit dem Signal wenn der Sortindicator wechselt ( was beim draufklicken geschiet )
// QT:SortOrder macht das es von AAA - ZZZ Sortiert wird.
connect(table->horizontalHeader(), SIGNAL(sortIndicatorChanged(int, Qt::SortOrder)),
this, SLOT(sortIndicatorChanged(int, Qt::SortOrder)));
QObject::connect ( btnaddtotable, SIGNAL ( clicked() ), this , SLOT(pushButtonClicked())) ;
QPalette Pal(palette());
Pal.setColor(QPalette::Background, Qt::green);
this->setAutoFillBackground(true);
this->setPalette(Pal);
table->setColumnWidth( 1, 119);
table->setColumnWidth( 0, 119);
this->setMaximumSize( 301,450 );
this->show();
txtname->show();
txtvalue->show();
}
void Tabelle::pushButtonClicked()
{
table->setSortingEnabled(false);
int i = -1;
Tabelle tabellen;
strname = ( txtname ->text ());
strvalue = ( txtvalue ->text ());
QList<QTableWidgetItem *> ItemList = table->findItems(strname, Qt::MatchExactly);
QMessageBox msb;
valueitem = new QTableWidgetItem(0);
nameitem = new QTableWidgetItem(0);
if ( ItemList.count() == false )
{
valueitem->setText(strvalue);
nameitem->setText(strname);
coucount = table->columnCount();
if ( cou >coucount )
{
table->insertRow(table->rowCount());
}
table->setItem( cou,1, valueitem );
table->setItem( cou, 0, nameitem);
cou++;
}
else {
msb.setText( " ' "+ strname + " ' "+ " alredy exist");
msb.setInformativeText("Do you want to add it ?");
msb.setStandardButtons(QMessageBox::Save | QMessageBox::Discard );
int ret = msb.exec();
switch (ret) {
case QMessageBox::Save:
valueitem->setText(strvalue);
nameitem->setText(strname);
coucount = table->columnCount();
if ( cou >coucount )
{
table->insertRow(table->rowCount());
}
table->setItem( cou,1, valueitem );
table->setItem( cou, 0, nameitem);
nameitem->setTextColor(Qt::red);
valueitem->setTextColor(Qt::red);
cou++;
break;
case QMessageBox::Discard:
txtname->clear();
txtvalue->clear();
break;
default:
return;
break;
}
}
table->setSortingEnabled(true);
}