Seite 1 von 1

Widget in Gridlayout einfügen

Verfasst: 26. März 2010 15:28
von exaveal
Hy.

Ich hab ein kleines Problem und bin noch zugegebenermaßen blutiger Anfänger.

Ich habe eine QWidget Klasse "MCT" als Hauptfenster. In diesem QWidget befindet sich ein GridLayout Design.

In dieses GridLayout will ich während der Laufzeit eine ebenfalls von QWidget abgeleitete Klasse "Test_show" mit Grafik einbinden. Das ganze funktioniert aber leider nicht.

Test_show.h

Code: Alles auswählen

#ifndef TEST_SHOW_H
#define TEST_SHOW_H

#include <QLayout>
#include "test.h"


// Einbinden eines Tests in grafische Programmoberflaeche

class Test_show: public QWidget
{
    //Q_OBJECT

public:
    Test_show(Datenbank &db, QString strUserID, QString strTesttyp, QWidget *parent = 0);
    ~Test_show();
private slots:
private:
    void erzeugeTest();
    Datenbank *db;
    QString strUserID;
    QString strTesttyp;
    QGridLayout *layoutInhalt;
    Test *test;

    std::vector<Frage *> Testfragen;
    std::vector<Frage *>::iterator it_Testfragen;
    std::vector<QLabel *> labFragen;
    std::vector<QLabel *>::iterator it_labFragen;

    QLabel *testlabel;
};

#endif // TEST_SHOW_H
Test_show.cpp

Code: Alles auswählen

#include "test_show.h"

Test_show::Test_show(Datenbank &db, QString strUserID, QString strTesttyp, QWidget *parent): QWidget(parent)
//Konstruktor
{
  qWarning() << "Test_show::Test_show():";
  this->db = &db;
  this->strUserID = strUserID;
  this->strTesttyp = strTesttyp;


  testlabel = new QLabel("blubbertest", this);
  testlabel->setGeometry(80,20,100,30);


  QLabel* qlab = new QLabel(this);  // Label
  qlab->setText( "first line\nsecond line" );
  qlab->setGeometry(20,20,100,30);
  QLineEdit* ledit = new QLineEdit(this);  // Text-Feld
  ledit->setText( "One editable line ..." );
  ledit->setGeometry(120,20,200,30);
  QPushButton *qpb = new QPushButton("Hello world!",this); // Knopf
  qpb->setGeometry(320,20,400,30);



  erzeugeTest();
}


Test_show::~Test_show()
// Destruktor
{
  qWarning() << "Test_show::~Test_show():";
  //delete labUeberschrift;
}


void Test_show::erzeugeTest()
{
  qWarning() << "Test_show::erzeugeTest():";
}

Test_show soll nun von dieser Klasse MCT aufgerufen werden (Stelle gekennzeichnet, in Funktion void MCT::TestFalsch()):

mct.cpp

Code: Alles auswählen

#include "mct.h"

MCT::MCT(int UserID, Datenbank &db, QWidget *parent): QWidget(parent)
//Konstruktor
{
  this->db = &db;

  // UserID in QString
  strUserID.setNum(UserID);


  // Fenstertitel und Fenstergroesse
  setWindowTitle(PROGRAMMNAME);
  setMinimumSize(800, 600);
  showMaximized();


  initZeiger();
  erzeugeInhalt();
  verbindeAktionen();
}


MCT::~MCT()
// Destruktor
{
  delete test_show;
  delete labUeberschrift;
  delete labVersion;
  delete labInformationen;
  delete labInhaltTitel;
  delete buttonTestNeu;
  delete buttonTestZufall;
  delete buttonTestFalsch;
  delete buttonHistorie;
  delete buttonEinstellungen;
  delete buttonAdministration;
  delete layoutMenue;
  delete layoutInhalt;
  delete layoutFenster;
}


void MCT::initZeiger()
// initialisiere temporaere Zeiger mit NULL
{
  test_show = NULL;
  buttonAdministration = NULL;
}


void MCT::erzeugeInhalt()
// erzeugt alle Buttons, Labels und Eingabefelder
{
  // --- Labels
  QString qstrProgrammname = "<b><font size=12>";
  qstrProgrammname += PROGRAMMNAME;
  qstrProgrammname += "</font></b>";
  labUeberschrift = new QLabel(qstrProgrammname, this);

  QString qstrVersion = "v";
  qstrVersion += VERSION;
  labVersion = new QLabel(qstrVersion, this);

  // hole Benutzername und Benutzertyp aus Datenbank
  QSqlQueryModel Query;
  QString sql_befehl = "select * from mct_users where id_user = ";
  sql_befehl += strUserID;
  if (!(db->sende(Query, sql_befehl)))
  {
    // keine Datenbankverbindung
    exit(1);
  }

  // gebe Benutzer gegebenfalls Administratorrechte
  if (Query.record(0).value("usertype").toString() == "admin")
    Admin = true;
  else
    Admin = false;

  QString qstrInformationen = "Angemeldet als ";
  qstrInformationen += Query.record(0).value("username").toString();
  qstrInformationen += "\nUserID: ";
  qstrInformationen += strUserID;
  if (Admin)
    qstrInformationen += "\nAdministrator";

  if (!(db->sende(Query, "SELECT _value FROM mct_settings WHERE _key = 'scheme'")))
  {
    // keine Datenbankverbindung
    exit(2);
  }

  qstrInformationen += "\n";
  qstrInformationen += Query.record(0).value("_value").toString();
  labInformationen = new QLabel(qstrInformationen, this);

  labInhaltTitel = new QLabel("<font size=5><b>Willkommen!</b></font>", this);
  // --- Labels Ende


  // --- Buttons
  buttonTestNeu = new QPushButton("Test mit neuen Fragen", this);
  buttonTestZufall = new QPushButton("Test mit zufaelligen Fragen", this);
  buttonTestFalsch = new QPushButton("Test mit falsch beantworteten Fragen", this);
  buttonHistorie = new QPushButton("Historie", this);
  buttonEinstellungen = new QPushButton("Einstellungen", this);
  if (Admin)
    buttonAdministration = new QPushButton("Administration", this);
  // --- Buttons Ende


  // --- Layout
  layoutFenster = new QGridLayout;
  layoutMenue = new QHBoxLayout;
  layoutInhalt = new QGridLayout;

  // Titelleiste
  layoutFenster->addWidget(labInformationen, 0, 0, Qt::AlignTop);
  layoutFenster->addWidget(labUeberschrift, 0, 1, Qt::AlignTop | Qt::AlignHCenter);
  layoutFenster->addWidget(labVersion, 0, 2, Qt::AlignTop | Qt::AlignRight);

  // Menue
  layoutMenue->addWidget(buttonTestNeu);
  layoutMenue->addWidget(buttonTestZufall);
  layoutMenue->addWidget(buttonTestFalsch);
  layoutMenue->addWidget(buttonHistorie);
  layoutMenue->addWidget(buttonEinstellungen);
  if (Admin)
    layoutMenue->addWidget(buttonAdministration);
  layoutFenster->addLayout(layoutMenue, 1, 0, 1, -1, Qt::AlignTop | Qt::AlignHCenter);

  // Inhalt
  layoutInhalt->addWidget(labInhaltTitel, 0, 0, 1, -1, Qt::AlignTop | Qt::AlignHCenter);
  layoutFenster->addLayout(layoutInhalt, 2, 0, 10, -1, Qt::AlignTop | Qt::AlignHCenter);

  setLayout(layoutFenster);
  // --- Layout Ende
}


void MCT::verbindeAktionen()
// Aktionen via Signals&Slots verknuepfen
{
  connect(buttonTestNeu, SIGNAL(clicked()), this, SLOT(TestNeu()));
  connect(buttonTestZufall, SIGNAL(clicked()), this, SLOT(TestZufall()));
  connect(buttonTestFalsch, SIGNAL(clicked()), this, SLOT(TestFalsch()));
  connect(buttonHistorie, SIGNAL(clicked()), this, SLOT(Historie()));
  connect(buttonEinstellungen, SIGNAL(clicked()), this, SLOT(Einstellungen()));
  if (Admin)
    connect(buttonAdministration, SIGNAL(clicked()), this, SLOT(Administration()));
}


void MCT::TestFalsch()
{
  labInhaltTitel->setText("<font size=5><b>Test mit falsch beantworteten Fragen</b></font>");

  // HIIIIIIIIIIIIIIIIIIIIIER: fuinktioniert aber nicht!
  test_show = new Test_show(*db, strUserID, "new");
  layoutInhalt->addWidget(test_show, 1, 0, 1, -1, Qt::AlignTop);
}