Qt - definiowanie własnych gniazd

Qt - definiowanie własnych gniazd
R9
  • Rejestracja:ponad 13 lat
  • Ostatnio:prawie 11 lat
  • Postów:41
0

Witam mam taki prosty kod w Qt.

Kopiuj
#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

Kopiuj
 #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

Kopiuj
 #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

Kopiuj
 #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.cpp:5:0:
a1.h:1:9: error: macro names must be identifiers
a1.cpp:9:6: error: ‘mojaklasa’ has not been declared
a1.cpp:14:1: 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
./

HO
  • Rejestracja:ponad 13 lat
  • Ostatnio:około 11 lat
  • Postów:283
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]


Jeśli uważasz mój post za wartościowy - daj punkt.
Mój post pomógł Ci rozwiązać problem - zaznacz go. Pozdrawiam
KR
  • Rejestracja:prawie 14 lat
  • Ostatnio:ponad 2 lata
  • Postów:353
0

Edit.

Masz prosty przyklad uzycia slotow

plik .h

Kopiuj
#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

Kopiuj
#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();
}
edytowany 2x, ostatnio: Krycho
HO
Gdzie niby masz include do QPushButton w pliku a1.h?
KR
jezu sry... jaki on ma balagan w kodzie. Spojrzalem na poczatek pierwszego myslalem ze to .h qpushbutton byl, a to nie wiadomo co.
R9
  • Rejestracja:ponad 13 lat
  • Ostatnio:prawie 11 lat
  • Postów:41
0

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

edytowany 1x, ostatnio: rafal92909
HO
  • Rejestracja:ponad 13 lat
  • Ostatnio:około 11 lat
  • Postów:283
0

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

plik .h

Kopiuj
#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ć.


Jeśli uważasz mój post za wartościowy - daj punkt.
Mój post pomógł Ci rozwiązać problem - zaznacz go. Pozdrawiam
edytowany 1x, ostatnio: Hostel
KR
Mnie zawsze uczyli zeby dawac include w plikach naglowkowych.
HO
Też kiedyś tak robiłem - na początku tak najłatwiej wytłumaczyć i w ogóle. Później jednak jak trafi się na dobrą książkę o projektowaniu kodu w sensie obiektowym jak i fizycznych zależnościach między plikami to w nagłówkach pozostawia się minimum a resztę wyrzuca do cpp.
R9
  • Rejestracja:ponad 13 lat
  • Ostatnio:prawie 11 lat
  • Postów:41
0

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

zad1.h

Kopiuj
 
#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

Kopiuj
#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

Kopiuj
 
#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::connect: No such slot QLineEdit::le_tekst1()
Object::connect: No such slot QLineEdit::le_tekst2()
Object::connect: No such slot QRadioButton::le_tekst1()
Object::connect: No such slot QRadioButton::le_tekst2()

Co robie nie tak?

KR
  • Rejestracja:prawie 14 lat
  • Ostatnio:ponad 2 lata
  • Postów:353
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.

edytowany 1x, ostatnio: Krycho
R9
  • Rejestracja:ponad 13 lat
  • Ostatnio:prawie 11 lat
  • Postów:41
0

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

Kliknij, aby dodać treść...

Pomoc 1.18.8

Typografia

Edytor obsługuje składnie Markdown, w której pojedynczy akcent *kursywa* oraz _kursywa_ to pochylenie. Z kolei podwójny akcent **pogrubienie** oraz __pogrubienie__ to pogrubienie. Dodanie znaczników ~~strike~~ to przekreślenie.

Możesz dodać formatowanie komendami , , oraz .

Ponieważ dekoracja podkreślenia jest przeznaczona na linki, markdown nie zawiera specjalnej składni dla podkreślenia. Dlatego by dodać podkreślenie, użyj <u>underline</u>.

Komendy formatujące reagują na skróty klawiszowe: Ctrl+B, Ctrl+I, Ctrl+U oraz Ctrl+S.

Linki

By dodać link w edytorze użyj komendy lub użyj składni [title](link). URL umieszczony w linku lub nawet URL umieszczony bezpośrednio w tekście będzie aktywny i klikalny.

Jeżeli chcesz, możesz samodzielnie dodać link: <a href="link">title</a>.

Wewnętrzne odnośniki

Możesz umieścić odnośnik do wewnętrznej podstrony, używając następującej składni: [[Delphi/Kompendium]] lub [[Delphi/Kompendium|kliknij, aby przejść do kompendium]]. Odnośniki mogą prowadzić do Forum 4programmers.net lub np. do Kompendium.

Wspomnienia użytkowników

By wspomnieć użytkownika forum, wpisz w formularzu znak @. Zobaczysz okienko samouzupełniające nazwy użytkowników. Samouzupełnienie dobierze odpowiedni format wspomnienia, zależnie od tego czy w nazwie użytkownika znajduje się spacja.

Znaczniki HTML

Dozwolone jest używanie niektórych znaczników HTML: <a>, <b>, <i>, <kbd>, <del>, <strong>, <dfn>, <pre>, <blockquote>, <hr/>, <sub>, <sup> oraz <img/>.

Skróty klawiszowe

Dodaj kombinację klawiszy komendą notacji klawiszy lub skrótem klawiszowym Alt+K.

Reprezentuj kombinacje klawiszowe używając taga <kbd>. Oddziel od siebie klawisze znakiem plus, np <kbd>Alt+Tab</kbd>.

Indeks górny oraz dolny

Przykład: wpisując H<sub>2</sub>O i m<sup>2</sup> otrzymasz: H2O i m2.

Składnia Tex

By precyzyjnie wyrazić działanie matematyczne, użyj składni Tex.

<tex>arcctg(x) = argtan(\frac{1}{x}) = arcsin(\frac{1}{\sqrt{1+x^2}})</tex>

Kod źródłowy

Krótkie fragmenty kodu

Wszelkie jednolinijkowe instrukcje języka programowania powinny być zawarte pomiędzy obróconymi apostrofami: `kod instrukcji` lub ``console.log(`string`);``.

Kod wielolinijkowy

Dodaj fragment kodu komendą . Fragmenty kodu zajmujące całą lub więcej linijek powinny być umieszczone w wielolinijkowym fragmencie kodu. Znaczniki ``` lub ~~~ umożliwiają kolorowanie różnych języków programowania. Możemy nadać nazwę języka programowania używając auto-uzupełnienia, kod został pokolorowany używając konkretnych ustawień kolorowania składni:

```javascript
document.write('Hello World');
```

Możesz zaznaczyć również już wklejony kod w edytorze, i użyć komendy  by zamienić go w kod. Użyj kombinacji Ctrl+`, by dodać fragment kodu bez oznaczników języka.

Tabelki

Dodaj przykładową tabelkę używając komendy . Przykładowa tabelka składa się z dwóch kolumn, nagłówka i jednego wiersza.

Wygeneruj tabelkę na podstawie szablonu. Oddziel komórki separatorem ; lub |, a następnie zaznacz szablonu.

nazwisko;dziedzina;odkrycie
Pitagoras;mathematics;Pythagorean Theorem
Albert Einstein;physics;General Relativity
Marie Curie, Pierre Curie;chemistry;Radium, Polonium

Użyj komendy by zamienić zaznaczony szablon na tabelkę Markdown.

Lista uporządkowana i nieuporządkowana

Możliwe jest tworzenie listy numerowanych oraz wypunktowanych. Wystarczy, że pierwszym znakiem linii będzie * lub - dla listy nieuporządkowanej oraz 1. dla listy uporządkowanej.

Użyj komendy by dodać listę uporządkowaną.

1. Lista numerowana
2. Lista numerowana

Użyj komendy by dodać listę nieuporządkowaną.

* Lista wypunktowana
* Lista wypunktowana
** Lista wypunktowana (drugi poziom)

Składnia Markdown

Edytor obsługuje składnię Markdown, która składa się ze znaków specjalnych. Dostępne komendy, jak formatowanie , dodanie tabelki lub fragmentu kodu są w pewnym sensie świadome otaczającej jej składni, i postarają się unikać uszkodzenia jej.

Dla przykładu, używając tylko dostępnych komend, nie możemy dodać formatowania pogrubienia do kodu wielolinijkowego, albo dodać listy do tabelki - mogłoby to doprowadzić do uszkodzenia składni.

W pewnych odosobnionych przypadkach brak nowej linii przed elementami markdown również mógłby uszkodzić składnie, dlatego edytor dodaje brakujące nowe linie. Dla przykładu, dodanie formatowania pochylenia zaraz po tabelce, mogłoby zostać błędne zinterpretowane, więc edytor doda oddzielającą nową linię pomiędzy tabelką, a pochyleniem.

Skróty klawiszowe

Skróty formatujące, kiedy w edytorze znajduje się pojedynczy kursor, wstawiają sformatowany tekst przykładowy. Jeśli w edytorze znajduje się zaznaczenie (słowo, linijka, paragraf), wtedy zaznaczenie zostaje sformatowane.

  • Ctrl+B - dodaj pogrubienie lub pogrub zaznaczenie
  • Ctrl+I - dodaj pochylenie lub pochyl zaznaczenie
  • Ctrl+U - dodaj podkreślenie lub podkreśl zaznaczenie
  • Ctrl+S - dodaj przekreślenie lub przekreśl zaznaczenie

Notacja Klawiszy

  • Alt+K - dodaj notację klawiszy

Fragment kodu bez oznacznika

  • Alt+C - dodaj pusty fragment kodu

Skróty operujące na kodzie i linijkach:

  • Alt+L - zaznaczenie całej linii
  • Alt+, Alt+ - przeniesienie linijki w której znajduje się kursor w górę/dół.
  • Tab/⌘+] - dodaj wcięcie (wcięcie w prawo)
  • Shit+Tab/⌘+[ - usunięcie wcięcia (wycięcie w lewo)

Dodawanie postów:

  • Ctrl+Enter - dodaj post
  • ⌘+Enter - dodaj post (MacOS)