Qt - definiowanie własnych gniazd

0

Witam mam taki prosty kod w Qt.

#include <stdlib.h>
#include <qapplication.h>
#include <qwidget.h>
#include <qpushbutton.h>

class mojaklasa : public QWidget
{
  public:
    mojaklasa();
  private:
    QPushButton *b1;
};

mojaklasa::mojaklasa()
{
  this->setMinimumSize(200,200);
  this->setMaximumSize(200,200);
  
  b1=new QPushButton("Hello",this); 
  b1->setGeometry(20,20,160,60);
}


int main(int argc, char **argv)
{
  QApplication a(argc,argv); 
  mojaklasa w;
  w.show(); 
  return a.exec(); 
} 

Chciałbym zdefiniować własne gniazdo. Na poczatek najprostsze z możliwych byleby działało poprawnie. Więc napisałem funkcje która będzie zamykać program (tak wiem ze jest takie gniazdo predefiniowane). Powyższy program przerobiłem tak:

Plik a1.h

 #ifndef a1_H
#define a1_H
class mojaklasa : public QWidget
{
  Q_OBJECT
  public:
    mojaklasa();
  private:
    QPushButton *b1;
  public slots:
  void MyExitSlot();
};
#endif

Plik a1.cpp

 #include <stdlib.h>
#include <qapplication.h>
#include <qwidget.h>
#include <qpushbutton.h>
#include "4_3.h"

void mojaklasa::MyExitSlot()
{
  exit(0);
}
mojaklasa::mojaklasa()
{
  this->setMinimumSize(200,200);
  this->setMaximumSize(200,200);
  
  b1=new QPushButton("Hello",this); //etykieta i widget macierzysty przycisku
  b1->setGeometry(20,20,160,60);
  
  connect(b1,SIGNAL(clicked()),this,SLOT(MyExitSlot()));
}

Plik main.cpp

 #include <stdlib.h>
#include <qapplication.h>
#include <qwidget.h>
#include <qpushbutton.h>
#include "4_3.h"

int main(int argc, char **argv)
{
  QApplication a(argc,argv); 
  mojaklasa w; 
  w.show(); 
  return a.exec(); 
}

Po probie kompilacji wysypuja się błędy:
In file included from a1.cpp0:
a1.h9: error: macro names must be identifiers
a1.cpp6: error: ‘mojaklasa’ has not been declared
a1.cpp1: error: ‘mojaklasa’ does not name a type

Proszę o pomoc w definiowaniu własnych gniazd w bibliotece Qt.
Dodam że piszę na ubuntu i kompiluje z konsoli za pomocą poleceń
qmake -project
qmake .pro
make
./

0

Po co Ci stdlib? To taka uwaga poza tematem.

W nagłówku masz:
[code]
private:
QPushButton *b1;
[/code]

kompilator krzyczy że nie zna typu. Muszisz zrobić przed deklaracją klasy:
[code]
class QPushButton;
[/code]

0

Edit.

Masz prosty przyklad uzycia slotow

plik .h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

// include robimy w pliku naglowkowym .h!!

#include <QMainWindow>
#include <QPushButton>
#include <QMessageBox>

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT
    
public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();
    
private:
    Ui::MainWindow *ui;
    QPushButton *popup;
private slots:
    void onClick(); // tworzymy sobie funkcje ktora bedzie wywolywana przy okreslonym sygnale tutaj przy kliknieciu przycisku
};

#endif // MAINWINDOW_H

plik .cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    popup = new QPushButton(this); // tworzymy obiekt i przypisujemy do rodzica czyli okna glownego
    popup->setGeometry(QRect(10,10,100,30)); // ustawiamy przycisk w oknie
    popup->setText("Click me");
    connect(popup,SIGNAL(clicked()),this,SLOT(onClick())); // laczymy przycisk ze slotem
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::onClick()
{
    QMessageBox msg; // prosty msgbox
    msg.setText("Test");
    msg.exec();
}
0

dzieki bardzo panowie za pomoc a nie ze zostałem od razu za wszystko opieprzony gdyż dopiero sie ucze ;)

0

@Krycho pozwolę sobie zmodyfikować nagłówek bo w plikach h powinno się unikać include. Powinno to wyglądać tak:

plik .h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H
// dziedziczymi więc potrzebny include
#include <QMainWindow>

class QPushButton; // zapowiedź klasy - nie robimy include, bo jest tylko wskaźnik

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT
    
public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();
    
private:
    Ui::MainWindow *ui;
    QPushButton *popup;
private slots:
    void onClick(); // tworzymy sobie funkcje ktora bedzie wywolywana przy okreslonym sygnale tutaj przy kliknieciu przycisku
};

#endif // MAINWINDOW_H

Include które wyrzuciłem są umieszczane w pliku cpp i przez to mamy większe odseparowanie kodu i kod powinien się szybciej kompilować.

0

a moglibyście zerknąć teraz na ten kod:

zad1.h

 
#ifndef ZAD1_H
#define ZAD1_H

#include <qapplication.h>
#include <qpushbutton.h>
#include <qlineedit.h>
#include <qwidget.h>
#include <qradiobutton.h>


class MyMainWindow: public QWidget
{
  Q_OBJECT
public:
  MyMainWindow();
  ~MyMainWindow();
private:
  QPushButton *b1;
  QPushButton *b2;
  QLineEdit *le1;
  QRadioButton *rb1;
  QRadioButton *rb2;
public slots:
  void le_tekst1();
  void le_tekst2();
};


#endif

zad1.cpp

#include "zad1.h"
void MyMainWindow::le_tekst1()
{
   le1->setText("Asia");
   rb2->setCheckable(false);
   rb1->setCheckable(true);
}

void MyMainWindow::le_tekst2()
{
  le1->setText("Kasia");
  rb1->setCheckable(false);
  rb2->setCheckable(true);
}

MyMainWindow::MyMainWindow()
{
  this->setGeometry(100,100,220,280);
  
  b1= new QPushButton("Asia",this);
  b1->setGeometry(20,20,80,45);
  b2= new QPushButton("Kasia",this);
  b2->setGeometry(120,20,80,45);
  
  le1= new QLineEdit("",this);
  le1->setGeometry(20,85,180,45);
  
  rb1 = new QRadioButton("Asia",this);
  rb1->setGeometry(20,150,180,45);
  rb2 = new QRadioButton("Kasia",this);
  rb2->setGeometry(20,215,180,45);
  
  connect(b1,SIGNAL(clicked()),le1,SLOT(le_tekst1()));
  connect(b2,SIGNAL(clicked()),le1,SLOT(le_tekst2()));
  connect(b1,SIGNAL(clicked()),rb1,SLOT(le_tekst1()));
  connect(b2,SIGNAL(clicked()),rb2,SLOT(le_tekst2()));

}

MyMainWindow::~MyMainWindow()
{
  delete b1;
  delete b2;
  delete le1;
  delete rb1;
  delete rb2;
} 

main.cpp

 
#include <qapplication.h>
#include "zad1.h"


int main(int argc, char **argv)
{
  QApplication a(argc,argv);
  MyMainWindow w;
  w.show();
  
  return a.exec();
   
}

Kompilacja przebiega pomyślnie natomiast podczas uruchamiania programu pojawiają się błędy odnośnie utworzonych gniazd i gniazda nie działają:
Object: No such slot QLineEdit::le_tekst1()
Object: No such slot QLineEdit::le_tekst2()
Object: No such slot QRadioButton::le_tekst1()
Object: No such slot QRadioButton::le_tekst2()

Co robie nie tak?

1

Nie do konca pojmujesy chyba idee sygnalow i slotow.

Stworzyles sobie 2 sloty, ale nie masz ich definicji. Slot to jest po prostu funkcja ktora wykonuje sie po nadejsciu sygnalu. Ty probujesz polaczyc sygnal klikniecia z lineEditem co jest bledem i o tym informuje Cie kompilator. Laczysz sygnal z odpowiednim slotem, sloty sa zazwyczaj w this(sa wyjatki) czyli connect(b1,signal(clicked()),this,slot(le_tekst1())); Robisz sobie funkcje i w tej funkcji kazesz mu cos zrobic.

0

aa ok teraz już kumam myślałem że łądze sygnał z tym elementem króry chce uzyć. dzieki bardzo :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1