MySubWindow

Du bist neu in der Welt von C++? Dann schau hier herein!
janmerkschien
Beiträge: 45
Registriert: 5. Juli 2011 10:08

Re: MySubWindow

Beitrag von janmerkschien »

Code: Alles auswählen

#ifndef MYSUBWINDOW_H
#define MYSUBWINDOW_H

#include <QMdiSubWindow>
#include <table.h>
class table;

class MySubWindow : public QMdiSubWindow
{

public:
    MySubWindow(QWidget *parent = 0);
    table *t;
public slots:
    void setZ(int);
private slots:
    void resizeEvent(QResizeEvent *resizeEvent);
signals:
    void resizeTable(table*, int);

private:
    int y;
};

#endif // MYSUBWINDOW_H
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Re: MySubWindow

Beitrag von franzf »

Dann hast du scheinbar die Doku nicht gelesen sondern nur überflogen. Das elementarste für SIGNAL/SLOT fehlt: Q_OBJECT-Macro in der Klassendefinition. Danach musst du das natürlich noch in die HEADERS-Variable im .pro packen, damit der moc auch moced.
janmerkschien
Beiträge: 45
Registriert: 5. Juli 2011 10:08

Re: MySubWindow

Beitrag von janmerkschien »

Viiiiiiiiiiiiiiiiiiiiiiiiielen DANK euch beiden (mordy und franzf) für eure schnelle hilfe,
ich habe es endlich geschafft :wink:

MfG Jan
Mordy
Beiträge: 13
Registriert: 29. Juli 2011 08:39

Re: MySubWindow

Beitrag von Mordy »

Na wunderbar... das mit dem Q_OBJECT hatte ich mir auch schon gedacht, obwohl´s fast schon wieder zu einfach war - deswegen die Frage nach der Header-Datei. ;)

edit: Ach so... wenn du ein die table.h inkludierst, dann brauchst du das "class table;" nicht mehr.
janmerkschien
Beiträge: 45
Registriert: 5. Juli 2011 10:08

Re: MySubWindow

Beitrag von janmerkschien »

ich glaub du vertauschst das . . .
ich habe das class table;
rausgenommen dann lief es nicht . ..
dann habe ich das class table; wieder rein geschrieben und das #include <table.h> rausgenommen und dann läuft es . . .
Mordy
Beiträge: 13
Registriert: 29. Juli 2011 08:39

Re: MySubWindow

Beitrag von Mordy »

Aha... kann es sein, dass er <table.h> nicht findet, weil du "table.h" nehmen musst? ;)
janmerkschien
Beiträge: 45
Registriert: 5. Juli 2011 10:08

Re: MySubWindow

Beitrag von janmerkschien »

nein auch nicht :P
der kompeliert nur wenn ich class table; nehme . . .
sonst kommt der fehler:
ISO C++ forbids declaration of 'table' with no type
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Re: MySubWindow

Beitrag von franzf »

Dann schau mal in dein Implementierungsfile (mainwindow.cpp o.Ä.), da ist sicher table.h korrekt eingebunden.
Im Header reicht eine Vorabdeklaration, da du den Typ nicht benutzt oder die genaue Größe wissen müsstest (resp. der Compiler).
Der Unterschied zwischen <table.h> und "table.h" ist der, dass die spitzen Klammernsagen "suche nur in globalen Include-Dirs" (z.B. solche per "-I" dem Compiler übergebenen), das in Anführungszeichen sucht erst relativ zum aktuellen Sourcefile. Letzteres ist das was du willst, ersteres funktioniert nur bei passender Konfiguration - was ich nicht denke dass du das gemacht hast.

Zeig mal noch table.h und mainwindow.cpp, dann wird sich auch dieses Problem (hoffentlich) klären.
janmerkschien
Beiträge: 45
Registriert: 5. Juli 2011 10:08

Re: MySubWindow

Beitrag von janmerkschien »

table.h:

Code: Alles auswählen

#ifndef table_H
#define table_H

#include <QDialog>
#include <qslider.h>
#include <tablemodel.h>
#include <QWidget>
#include <mysubwindow.h>

QT_BEGIN_NAMESPACE
class QDialogButtonBox;
class QPushButton;
class QSqlTableModel;
class QSqlQueryModel;
class QMdiArea;
class QLineEdit;
class QTableView;
QT_END_NAMESPACE


class table : public QWidget
{
    Q_OBJECT

public:
    table(QWidget *parent=0);
    Qt::ItemFlags flags(const QModelIndex &index) const;

    int posi,x,z,min;

    QString s,Sposi,Spossi,where,limit;


public slots:
    void refresh(int);
    void filter();
    void changeTip(int);
    void getZ(table*, int);

private:
    void setslider();
    QPushButton *filterButton;
    QPushButton *quitButton;
    QSqlQueryModel *model;
    QTableView *view;
    QLineEdit *filterlineV;
    QLineEdit *filterlineN;
    QLineEdit *filterlineS;
    QLineEdit *filterlineP;
    QLineEdit *filterlineO;
    QSlider *slider;


};

#endif
mainwindow.cpp:

Code: Alles auswählen

 #include <QtGui>
 #include "mainwindow.h"
 #include "mdichild.h"
 #include "adddialog.h"
 #include "table.h"
 #include <mysubwindow.h>

 MainWindow::MainWindow()
 {
     mdiArea = new QMdiArea;
     mdiArea->setHorizontalScrollBarPolicy(Qt::ScrollBarAsNeeded);
     mdiArea->setVerticalScrollBarPolicy(Qt::ScrollBarAsNeeded);

     setCentralWidget(mdiArea);
     connect(mdiArea, SIGNAL(subWindowActivated(QMdiSubWindow*)), this, SLOT(updateMenus()));

     windowMapper = new QSignalMapper(this);
     connect(windowMapper, SIGNAL(mapped(QWidget*)), this, SLOT(setActiveSubWindow(QWidget*)));


     createActions();
     createMenus();
     createToolBars();
     createStatusBar();
     updateMenus();


     addToolBar(Qt::LeftToolBarArea,fileToolBar);
     setWindowTitle(tr("MDI"));
     setUnifiedTitleAndToolBarOnMac(true);
 }

 void MainWindow::closeEvent(QCloseEvent *event)
 {
     mdiArea->closeAllSubWindows();
     if (mdiArea->currentSubWindow()) {
         event->ignore();
     } else {
         event->accept();
     }
 }

 void MainWindow::newFile()
 {
     sw = new QMdiSubWindow();
     sw->setWidget(new AddDialog(sw));
     sw->setAttribute(Qt::WA_DeleteOnClose);
     mdiArea->addSubWindow(sw);
     sw->show();

 }


 void MainWindow::open()
 {
     MySubWindow *sw = new MySubWindow();
     table *t = new table(sw);
     sw->setWidget(t);

     sw->setAttribute(Qt::WA_DeleteOnClose);
     mdiArea->addSubWindow(sw);
     sw->resize(700,480);
     sw->show();


     connect(sw,SIGNAL(resizeTable(table *,int)),t,SLOT(getZ(table*,int)));

 }


 void MainWindow::save()
 {
     if (activeMdiChild())
     activeMdiChild()->save();

 }


 void MainWindow::updateMenus()
 {



     bool hasMdiChild = (activeMdiChild());
     if(hasMdiChild == 0)
     hasMdiChild = (activeTMdiChild());


     saveAct->setEnabled(hasMdiChild);
     pasteAct->setEnabled(hasMdiChild);
     closeAct->setEnabled(hasMdiChild);
     closeAllAct->setEnabled(hasMdiChild);
     tileAct->setEnabled(hasMdiChild);
     cascadeAct->setEnabled(hasMdiChild);
     nextAct->setEnabled(hasMdiChild);
     previousAct->setEnabled(hasMdiChild);
     separatorAct->setVisible(hasMdiChild);


 }

 void MainWindow::updateWindowMenu()
 {
     windowMenu->clear();
     windowMenu->addAction(closeAct);
     windowMenu->addAction(closeAllAct);
     windowMenu->addSeparator();
     windowMenu->addAction(tileAct);
     windowMenu->addAction(cascadeAct);
     windowMenu->addSeparator();
     windowMenu->addAction(nextAct);
     windowMenu->addAction(previousAct);
     windowMenu->addAction(separatorAct);

     QList<QMdiSubWindow *> windows = mdiArea->subWindowList();
     separatorAct->setVisible(!windows.isEmpty());

     for (int i = 0; i < windows.size(); ++i) {
         AddDialog *child = qobject_cast<AddDialog *>(windows.at(i)->widget());

         QString text;
         if (i < 9) {
             text = tr("Add %2").arg(i + 1);

         } else {
             text = tr("Add %2").arg(i + 1);

         }
         QAction *action  = windowMenu->addAction(text);
         action->setCheckable(true);
         action ->setChecked(child == activeMdiChild());
         connect(action, SIGNAL(triggered()), windowMapper, SLOT(map()));
         windowMapper->setMapping(action, windows.at(i));
     }
 }


 void MainWindow::createActions()
 {
     newAct = new QAction(QIcon(":/images/new.png"), tr("&Neu"), this);
     newAct->setShortcuts(QKeySequence::New);
     newAct->setStatusTip(tr("Neuer Eintrag"));
     connect(newAct, SIGNAL(triggered()), this, SLOT(newFile()));

     openAct = new QAction(QIcon(":/images/tabelle.png"), tr("&Open..."), this);
     openAct->setShortcuts(QKeySequence::Open);
     openAct->setStatusTip(tr("Tabelle Öffnen"));
     connect(openAct, SIGNAL(triggered()), this, SLOT(open()));

     saveAct = new QAction(QIcon(":/images/save.png"), tr("&Speichern"), this);
     saveAct->setShortcuts(QKeySequence::Save);
     saveAct->setStatusTip(tr("Speichern"));
     connect(saveAct, SIGNAL(triggered()), this, SLOT(save()));

     sldAct = new QAction(QIcon(":/images/sld.png"),tr("Layout Ausrichtung wechseln"),this);
     sldAct->setStatusTip("Layout Ausrichtung wechseln");
     connect(sldAct, SIGNAL(triggered()), this, SLOT(switchLayoutDirection()));

     exitAct = new QAction(QIcon(":/images/exit.png"), tr("Schließen"), this);
     exitAct->setShortcuts(QKeySequence::Quit);
     exitAct->setStatusTip(tr("Schließen"));
     connect(exitAct, SIGNAL(triggered()), qApp, SLOT(closeAllWindows()));

     cutAct = new QAction(QIcon(":/images/cut.png"), tr("Cu&t"), this);
     cutAct->setShortcuts(QKeySequence::Cut);
     cutAct->setStatusTip(tr("Ausschneiden"));
     connect(cutAct, SIGNAL(triggered()), this, SLOT(cut()));

     copyAct = new QAction(QIcon(":/images/copy.png"), tr("&Copy"), this);
     copyAct->setShortcuts(QKeySequence::Copy);
     copyAct->setStatusTip(tr("Kopieren"));
     connect(copyAct, SIGNAL(triggered()), this, SLOT(copy()));

     pasteAct = new QAction(QIcon(":/images/paste.png"), tr("&Paste"), this);
     pasteAct->setShortcuts(QKeySequence::Paste);
     pasteAct->setStatusTip(tr("Einfügen"));
     connect(pasteAct, SIGNAL(triggered()), this, SLOT(paste()));

     closeAct = new QAction(QIcon(":/images/exit.png"),tr("Schließen"), this);
     closeAct->setStatusTip(tr("Schließt das aktive Fenster"));
     connect(closeAct, SIGNAL(triggered()), mdiArea, SLOT(closeActiveSubWindow()));

     closeAllAct = new QAction(QIcon(":/images/exit-all.png"),tr("Alle Schließen"), this);
     closeAllAct->setStatusTip(tr("Alle Fenster schließen"));
     connect(closeAllAct, SIGNAL(triggered()), mdiArea, SLOT(closeAllSubWindows()));

     tileAct = new QAction(QIcon(":/images/tile.png"),tr("&Kacheln"), this);
     tileAct->setStatusTip(tr("Fenster Kacheln"));
     connect(tileAct, SIGNAL(triggered()), mdiArea, SLOT(tileSubWindows()));

     cascadeAct = new QAction(QIcon(":/images/cascade.png"),tr("&Wassserfall"), this);
     cascadeAct->setStatusTip(tr("Ordnet die Fenster wie einen Wasserfall an"));
     connect(cascadeAct, SIGNAL(triggered()), mdiArea, SLOT(cascadeSubWindows()));

     nextAct = new QAction(QIcon(":/images/arrow-rechts.png"),tr("&Nächstes"), this);
     nextAct->setShortcuts(QKeySequence::NextChild);
     nextAct->setStatusTip(tr("Wechselt zum nächstem Fenster"));
     connect(nextAct, SIGNAL(triggered()), mdiArea, SLOT(activateNextSubWindow()));

     previousAct = new QAction(QIcon(":/images/arrow-links.png"),tr("&Vorheriges"), this);
     previousAct->setShortcuts(QKeySequence::PreviousChild);
     previousAct->setStatusTip(tr("Wechselt zum vorherigem Fenster"));
     connect(previousAct, SIGNAL(triggered()), mdiArea, SLOT(activatePreviousSubWindow()));

     separatorAct = new QAction(this);
     separatorAct->setSeparator(true);

 }

 void MainWindow::createMenus()
 {

     fileMenu = menuBar()->addMenu(tr("&File"));
     fileMenu->addAction(newAct);
     fileMenu->addAction(openAct);
     fileMenu->addAction(saveAct);
     fileMenu->addSeparator();
     fileMenu->addAction(sldAct);
     fileMenu->addAction(exitAct);

     windowMenu = menuBar()->addMenu(tr("&Window"));
     updateWindowMenu();
     connect(windowMenu, SIGNAL(aboutToShow()), this, SLOT(updateWindowMenu()));

 }

 void MainWindow::createToolBars()
 {


     fileToolBar = addToolBar(tr("File"));
     fileToolBar->addAction(newAct);
     fileToolBar->addAction(openAct);
     fileToolBar->addAction(saveAct);

 }

 void MainWindow::createStatusBar()
 {
     statusBar()->showMessage(tr("Fertig"));
 }

 AddDialog *MainWindow::activeMdiChild()
 {
     if (QMdiSubWindow *activeSubWindow = mdiArea->activeSubWindow())
         return qobject_cast<AddDialog *>(activeSubWindow->widget());
     return 0;
 }

 table *MainWindow::activeTMdiChild(){
     if(QMdiSubWindow *activeSubWindow = mdiArea->activeSubWindow())
         return qobject_cast<table *>(activeSubWindow->widget());
     return 0;
 }

 void MainWindow::switchLayoutDirection()
 {
     if (layoutDirection() == Qt::LeftToRight)
         qApp->setLayoutDirection(Qt::RightToLeft);
     else
         qApp->setLayoutDirection(Qt::LeftToRight);
 }

 void MainWindow::setActiveSubWindow(QWidget *window)
 {
     if (!window)
         return;
     mdiArea->setActiveSubWindow(qobject_cast<QMdiSubWindow *>(window));
 }
 void MainWindow::closee(){
   mdiArea->closeActiveSubWindow();
 }


franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Re: MySubWindow

Beitrag von franzf »

Argh, sry... ich meinte nicht die mainwindow.cpp sondern die mysubwindow.cpp. (Bis hierhin schaut alles ganz gut aus, bis auf die falschen #includes deiner eigenen Header -> pass das bitte mal an.)
janmerkschien
Beiträge: 45
Registriert: 5. Juli 2011 10:08

Re: MySubWindow

Beitrag von janmerkschien »

hier die mysubwindow.cpp:

Code: Alles auswählen

#include "mysubwindow.h"
#include "table.h"

MySubWindow::MySubWindow(QWidget *parent)
    :QMdiSubWindow(parent)

{
}

void MySubWindow::resizeEvent(QResizeEvent *event){
    y= this->size().height();
    y=y-30;
    y=y/40;
    emit resizeTable(t,y);
    QMdiSubWindow::resizeEvent(event);
}
void MySubWindow::setZ(int y){
    setWindowTitle("lol");
}
meinst du mit falschen includes das ich auch <>, "" machen soll??
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Re: MySubWindow

Beitrag von franzf »

janmerkschien hat geschrieben:meinst du mit falschen includes das ich auch <>, "" machen soll??
Genau. Es könnte sein, dass du irgendwo noch eine table.h rumliegen hast, die sich durch die <> in dein Projekt schleicht.

Auch in der mysubwindow.cpp scheint alles korrekt zu sein. Wenn nach der Änderung ALLER includes in deinem Projekt immer noch Fehler auftreten, kannst du das mal in ein .zip o.Ä. packen und hier anhängen? (Gesamtes Projekt, wenns geht, nur die Sourcen, keine .exe oder Libs)
janmerkschien
Beiträge: 45
Registriert: 5. Juli 2011 10:08

Re: MySubWindow

Beitrag von janmerkschien »

also mein programm läuft ja ich muss nur in der header von mysubwindow.cpp class table; schreiben. . .
ist das denn schlimm?
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Re: MySubWindow

Beitrag von franzf »

Nein, ist nicht schlimm. Aber ein #include "table.h" sollte definitiv auch funktionieren, da es das nicht tut muss irgend was im Argen sein (evtl. hilft ja auch ein einfaches make clean)...
Antworten