Portál AbcLinuxu, 7. května 2025 19:32

Dotaz: C++ QT Sloty

8.1.2012 12:39 Aleš
C++ QT Sloty
Přečteno: 745×
Odpovědět | Admin
Zdravím. Skoušel jsem si napsat c++ zakladní aplikačku s QT a narazil jsem na sloty kde se mě stala chyba který nejse, schopen porozumět.

using namespace std;

class ClassPrihlasit : public QObject
 {
     Q_OBJECT

public slots:
     void cppSlot() { cout << "Called the C++ slot with message:"; }

 };




int main(int argc, char *argv[])
{
  QApplication app(argc, argv);

QWidget *window = new QWidget();
//sirka výska
         window->resize(200, 110);



     QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL");
                  db.setHostName("88.86.113.81");
                  db.setDatabaseName("chat");
                  db.setUserName("chat");
                  db.setPassword("********");
                  db.open();


                  QSqlQuery sql;


                  sql.prepare( "SELECT id FROM uzivatele where email='info@efadesigner.cz' and heslo=sha1('********')" );
                  sql.exec();

                      QSqlRecord rec = sql.record();

                      int pocet = rec.count();

                      cout << pocet;






QLabel     *email = new QLabel(QString("Email: "), window );
            email->setObjectName( "email" );
            email->setGeometry( QRect(20, 10, 83, 21) );

QLineEdit  *email_input = new QLineEdit(QString(""), window );
            email_input->setObjectName( "textEdit" );
            email_input->setGeometry( QRect(60, 10,100, 21) );



QLabel     *heslo = new QLabel(QString("Heslo: "), window );
            heslo->setObjectName( "heslo" );
            heslo->setGeometry( QRect(20, 40, 83, 21) );

QLineEdit  *heslo_input = new QLineEdit(QString(""), window );
            heslo_input->setObjectName( "textEdit" );
            heslo_input->setGeometry( QRect(60, 40,100, 21) );
            heslo_input->setEchoMode(QLineEdit::Password);



QPushButton *prihlasit = new QPushButton(QString("Prihlasit"), window);
             //ODSAZENI OD LEVA , VRCHU, SIRKA VYSKA
             prihlasit->setGeometry(120, 70, 80, 30);






  //události



          ClassPrihlasit test;
          QObject::connect(prihlasit, SIGNAL(clicked()),&test, SLOT(cppSlot()));


     window->show();
  return app.exec();
}

skoro dole volam udalost cppSlot() kliknutim na tlacitko prihlasit ale hlásí mě to chybu (.text.startup+0x5ab):-1: error: undefined reference to `vtable for ClassPrihlasit' pritom tu class mam definovanou nahoře, už netuším co dělám špatně a za jakou koliv radu co povede k řešení budu Rád. :-)

Řešení dotazu:


Nástroje: Začni sledovat (0) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

stativ avatar 8.1.2012 12:57 stativ | skóre: 54 | blog: SlaNé roury
Rozbalit Rozbalit vše Re: C++ QT Sloty
Odpovědět | | Sbalit | Link | Blokovat | Admin
Nikde nevidím, že bys vkládal vygenerovaný .moc soubor. Pokud ho nezkompiluješ (buď se přidává include na konec souboru s QObjectem, nebo se v buildsystému přidá jako další soubor se zdrojáky), dělá to přesně tyhle chyby
Ať sežeru elfa i s chlupama!!! ljirkovsky.wordpress.com stativ.tk
8.1.2012 13:07 Aleš
Rozbalit Rozbalit vše Re: C++ QT Sloty
Předem Děkuji za rychlou reakci , na toto jsem již na internetu někde narazil, ale nepochopil jsem kde bych soubor .moc sebral a popřípadě co by melo byti jeho obsahem. žádný takovýto soubor nemam v projektu, prosím o nakopnutí děkuji
stativ avatar 8.1.2012 13:18 stativ | skóre: 54 | blog: SlaNé roury
Rozbalit Rozbalit vše Re: C++ QT Sloty
Moc soubor ti vygeneruje samo Qt pomocí metaobject compileru. Můžeš ho vygenerovat ručně puštěním příkazu moc na příslušný hlavičkový soubor, což se obvykle nedělá, protože je to pracné a snadno se to zapomene.

Mnohem lepší je moc soubory generovat automaticky. qmake to pokud vím dělá samo bez dalšího zásahu, jak to udělat pro obyčejný makefile je popsáno přímo v dokumentaci Qt. Pro CMake je možné použít buď qt4_automoc() na všechny zdrojáky a moc se vygeneruje pro všechny, pro které je to potřeba, nebo lze použít qt4_wrap_cpp() pro vygenerování moc pro konkrétní soubor.
Ať sežeru elfa i s chlupama!!! ljirkovsky.wordpress.com stativ.tk
8.1.2012 13:28 Aleš
Rozbalit Rozbalit vše Re: C++ QT Sloty
Děkuji snad na to už příjdu kam to zapsat a jak v QT creatoru , pokud i toto by jste věděl a podělil se o znalost byl bych vděčný, ale už i tak mnohokrat děkuji za rady
stativ avatar 8.1.2012 13:46 stativ | skóre: 54 | blog: SlaNé roury
Rozbalit Rozbalit vše Re: C++ QT Sloty
Tak s Qt Creatorem bohužel neporadím, protože ho nepoužívám.
Ať sežeru elfa i s chlupama!!! ljirkovsky.wordpress.com stativ.tk
8.1.2012 13:49 Aleš
Rozbalit Rozbalit vše Re: C++ QT Sloty
tak ten soubor .moc s me uz vygeneroval ale hlasí to mraky chyb. Jak mohu ten soubor upravit? Hlásí me to chyby typu /home/ales/c++/Chat-build-desktop/main.moc:42: error: ‘ClassPrihlasit’ has not been declared V závyslosti na kodu co jsem postoval nahoře. Myslel jsem že když se ten moc generuje automaticky tak že by měl byt bez chybnej v QT creatoru jen pro ilustraci v main.cpp jsem nahoru napsal #include main.moc se spicatejma zavorkama jen me nejdou sem napsat :-D pak jsem dal opet ctrl+r pro kompilaci a hups byli tito chyby v moc souboru main.moc
stativ avatar 8.1.2012 13:50 stativ | skóre: 54 | blog: SlaNé roury
Rozbalit Rozbalit vše Re: C++ QT Sloty
moc se includuje až na konci souboru.
Ať sežeru elfa i s chlupama!!! ljirkovsky.wordpress.com stativ.tk
8.1.2012 13:55 Aleš
Rozbalit Rozbalit vše Re: C++ QT Sloty
Děkuji to bylo ono co jsem hledal mnohokrat dekuji už to funguje tak me ten slot se snad spusti už
8.1.2012 14:45 sachmat
Rozbalit Rozbalit vše Re: C++ QT Sloty
V qt hlavne nie je velmi odporucane mat definiciu triedy v jednom subore ako main(). V zasade sa odporuca mat pre kazdu triedu, ktora ma v tele makro Q_OBJECT (teda sa pre tuto triedu vytvori moc subor) zvlast subor. Takto si zarucis, ze nebudes mat problem so zahadnymi a nicnehovoriacimi vtable chybami pri kompilacii:)
9.1.2012 10:34 Aleš
Rozbalit Rozbalit vše Re: C++ QT Sloty
TAk struktura C++ aplikace me dela jeste problemy zatim se v tom mirrne placam co ma byt v .h souborech co v cpp a jak si mezi tim predavat parametry
9.1.2012 12:25 Aleš
Rozbalit Rozbalit vše Re: C++ QT Sloty
Hlavně nechapu proč me nefungujou sloty když je mam uvnotř funkce , nehlasí to žadnou chbu nic jen to proste po kliknuti nefunguje :-( a na google jsem si stim nejak moc neporadil pokud by nekdo mel radu dekuji
Josef Kufner avatar 9.1.2012 13:20 Josef Kufner | skóre: 70
Rozbalit Rozbalit vše Re: C++ QT Sloty
Odpovědět | | Sbalit | Link | Blokovat | Admin
Doporučuju vzít nějaký hello world z tutoriálu a zkusit si to rozbít. Řešíš problémy ve věcech, které mají fungovat zcela automaticky a bez práce.
Hello world ! Segmentation fault (core dumped)
9.1.2012 13:39 Aleš
Rozbalit Rozbalit vše Re: C++ QT Sloty
to prave rozebrane mam udelal jsem si funkci
void GrafikaPrihlaseni(){



QWidget     *window = new QWidget();
             //sirka výska
             window->resize(200, 110);

QLabel     *email = new QLabel(QString("Email: "), window );
            email->setObjectName( "email" );
            email->setGeometry( QRect(20, 10, 83, 21) );

QLineEdit  *email_input = new QLineEdit(QString(""), window );
            email_input->setObjectName( "textEdit" );
            email_input->setGeometry( QRect(60, 10,100, 21) );

QLabel     *heslo = new QLabel(QString("Heslo: "), window );
            heslo->setObjectName( "heslo" );
            heslo->setGeometry( QRect(20, 40, 83, 21) );


QLineEdit   *heslo_input = new QLineEdit(QString(""), window );
            heslo_input->setObjectName( "textEdit" );
            heslo_input->setGeometry( QRect(60, 40,100, 21) );
            heslo_input->setEchoMode(QLineEdit::Password);



QPushButton *prihlasit = new QPushButton(QString("Prihlasit"), window);
             //ODSAZENI OD LEVA , VRCHU, SIRKA VYSKA
             prihlasit->setGeometry(120, 70, 80, 30);




             //události
        prihlaseni  prihlasit_click;
        QWidget::connect(prihlasit, SIGNAL(clicked()),&prihlasit_click, SLOT(UserPrihlaseni()));


     window->show();

}
kterou si samozrejme radne pripojim do projektu (je v samostatnem souboru) a prez hlavickove soubory ji pripojim a z main zavolam , grafika se zobrazi, ale kdyz kliknu na tlacitko tak to nic nevykona ani chybu to nezobrazi ale kdyz to dam cele do mainu tak to projde v pohode :-( hellou word jsem rozebral snad uz vsechno co jsem nasel :-D
Josef Kufner avatar 9.1.2012 14:40 Josef Kufner | skóre: 70
Rozbalit Rozbalit vše Re: C++ QT Sloty
Koukni na QGridLayout.

Pak ještě vyhoď using namespace std;. Motat si do Qt STL je celkem zbytečné. Na ladicí výpisy máme qDebug().

A doporučuju použvat konvence pojmenovávání jako má Qt. Je to pak krásně jednotné a přehledné, i když to není to co máš nejraději, je ta jednotnost lepší než to motat.

Také je lepší zdědit si třídu QWidget a v konstruktoru vyrobit všechny widgety co tam chceš. Pak místo QObject::connect() ti stačí prostě jen connect(widget, signál, this, SLOT(privátní_metoda)).

A teď k té chybě:

Pokud vyrobíš objekt prihlasit_click jen takle bez new, tak se při ukončení metody, kde byl vytvořen, zlikviduje, takže později při zavolání slotu už ten objekt neexistuje. Buď ho vyrob pomocí new a měj u něj konstruktor s parametrem QObject *parent, který předáš při inicializaci do QObject, aby se Qt postaralo automaticky o uklizení objektu při likvidaci rodiče, nebo si ho dovnitř předej odjinud.
  Prihlasit *prihlasitClick = new Prihlasit(window);
  QWidget::connect(prihlasit, SIGNAL(clicked()), prihlasitClick, SLOT(UserPrihlaseni()));
Chybu to nehlásí, protože při likvidaci objektu prihlasit_click se zlikvidují i propojení signálů, takže v okamžiku, kdy klikneš na to tlačíko už není nic napojeno.

V main() to funguje jen díky tomu, že instance objektu existuje i v době, kdy voláš app.exec().

Takže to co jsi udělal by mělo vypadat takto:
class WidgetPrihlaseni : QWidget {

 private:
     QLineEdit *m_email;
     QLineEdit *m_heslo;

 public:
     WidgetPrihlaseni(QWidget *parent = NULL) : QWidget(parent)
     {

            //sirka výska
            // window->resize(200, 110); -- neni treba, qt to spocita samo

            QGridLayout layout = new QGridLayout(this);

            QLabel *email_label = new QLabel(QString("Email:"));
            layout->addWidget(email_label, 1, 1);

            m_email = new QLineEdit(QString(""));
            layout->addWidget(m_email, 1, 2);

            QLabel *heslo = new QLabel(QString("Heslo:"));
            layout->addWidget(heslo, 2, 1);

            m_heslo = new QLineEdit();
            m_heslo->setEchoMode(QLineEdit::Password);
            layout->addWidget(m_heslo, 2, 2);

            QPushButton *prihlasit = new QPushButton(QString("Prihlasit"));
            layout->addWidget(prihlasit, 3, 2);

            //události
            connect(prihlasit, SIGNAL(clicked()), login, SLOT(UserPrihlaseni()));

            // this->show(); -- neni treba, vola se to samo
            //                  rekurzivne, takze to patri jen jednou do main()
     }

  public slots:

     void login()
     {
        // Tady nebudeš dělat samotné přihlášení, ale jen
        // přepošleš data jinému objektu někde v aplikaci,
        // který se stará o session.
        qDebug() << "email:" << m_email->text();
        qDebug() << "heslo:" << (m_heslo->text() == "" ? "empty" : "*****");
        emit submited(m_email->text(), m_heslo->text());
     }

  signals:

     void submited(const QString & email, const QString & password);
};
Hello world ! Segmentation fault (core dumped)
9.1.2012 16:20 Aleš
Rozbalit Rozbalit vše Re: C++ QT Sloty
TAk asi jsem tatar ale vubec jsem nepochopil kam co mam dat z toho kodu ale i tak dekuji
9.1.2012 16:27 Aleš
Rozbalit Rozbalit vše Re: C++ QT Sloty
Ten Váš kod jsem použil dal jsem si ho do mainwindow.h

v main cpp jsem si ho naincludoval a dal jsem si tam

QWidget *window = new WidgetPrihlaseni;

ale bohuzel me to napise ze

/home/ales/c++/chat4-build-desktop/../chat4/mainwindow.h:20: error: conversion from ‘QGridLayout*’ to non-scalar type ‘QGridLayout’ requested
9.1.2012 19:52 sachmat
Rozbalit Rozbalit vše Re: C++ QT Sloty
Niekde v tom mainwindow.h asi definujes layout ako pointer QGridLayout * ale v mainwindow.cpp zrejme tu premennu pouzivas ako skalarnu (layout.funkcia miesto layout->funkcia)
9.1.2012 20:08 Aleš
Rozbalit Rozbalit vše Re: C++ QT Sloty
nahore jsem musel napsat public pred QWidget class WidgetPrihlaseni : public QWidget { a dole ve slotu misto ligon dat thist a login jako slot a pak do main.cp jsem si to naincludoval a dal
QWidget *window= new WidgetPrihlaseni;
           window->show();
a uz me to jelo ok a pokud mohu jest jednu otazku jak pak vypnu to oknu? krom toho ze bych to main.cpp napsal window->close() ale napr z nejake vnejsi funkce zda k tomu jde pristoupit do toho main a tu promenou window proste vypnotu cvy vyvolat a vypnout jinde?
Josef Kufner avatar 9.1.2012 21:29 Josef Kufner | skóre: 70
Rozbalit Rozbalit vše Re: C++ QT Sloty
Ten kód jsem nijak netestoval, takže těch pár chyb se celkem dalo čekat ;-)

Ještě je dobrým zvykem těla metod přesunout do cpp souboru a v hlavičkovém mít jen deklarace. Takle dohromady jsem to sesypal kvůli čitelnosti v diskusi.

to okno zlikviduješ stejně jako jakýkoliv jiný widget – doporučuju zavolat slot (metodu) deleteLater(). Případně si můžeš hrát s hide() a show(). Odkud to budeš volat záleží na kontextu a na logice aplikace.

Na modální dialogy je ale lepší použít třídu QDialog a z ní zděděné.

Použití pak může vypadat takto:
  LoginDialog ld;
  if (ld.exec() == QDialog::Accepted) {
    qDebug() << ld.email() << ld.password();
  }
Modifikaci kódu z mého minulého příspěvku určitě zvládneš, vlastně jen změníš rodičovskou třídu z QWidget na QDialog a doladíš detaily.
Hello world ! Segmentation fault (core dumped)
9.1.2012 22:10 Aleš
Rozbalit Rozbalit vše Re: C++ QT Sloty
jiank jeste k tomu mazani widgetu to sice ano treba v main jsem to mazal
window->close();
a bylo vystarano ale to nemohu udelat v najake funkci kdyz je to ve tride uplne nekde jinde :-D a destruktor me na to nefunguje :-D jinak dialog je fakt lepsi :)
Josef Kufner avatar 9.1.2012 21:32 Josef Kufner | skóre: 70
Rozbalit Rozbalit vše Re: C++ QT Sloty
Jo, chybí tam hvězdička v deklaraci proměnné layout.
Hello world ! Segmentation fault (core dumped)
9.1.2012 21:37 Aleš
Rozbalit Rozbalit vše Re: C++ QT Sloty
jo jot e hvezdicky jsem si vsiml hnet to jsem uz nejak neresil ja jsem se setkal s QT jen na perl v c++ je to pro me mirne pase napt v perl jsem udelal seznam_user->setGeometry( QRect(2, 0, 196, 490) ); a hulahop bylo to zvetsene a presne jak jsem chtel tady to tam napisu a uplne me to ignoruje a v dokumentaci to maj taky :-D takze me jeste asi chvilku potrva nez to cele pochopim takze dekuji za schovyvavost.
9.1.2012 23:39 Aleš
Rozbalit Rozbalit vše Re: C++ QT Sloty
/home/ales/c++/chat4/mainwindow.cpp:-1: error: undefined reference to `vtable for KontaktList' a jeste toto toto se me stalo u main.cpp a vyresil jsem to
#include "main.moc" 
ted me to hlasi pro Kontakt List v mainwindow a uz sem skousel davat include "mainwindow.moc" i kontaktlist.moc (podle nazvu cpp) snad vsude kde se dalo na konce souboru postupne a nic nepomohlo, vsude radej pripojte tam ten soubor ale jak ho tam amm pripojit kdyz to stejne na to nereaguje?
9.1.2012 23:39 Aleš
Rozbalit Rozbalit vše Re: C++ QT Sloty
/home/ales/c++/chat4/mainwindow.cpp:-1: error: undefined reference to `vtable for KontaktList' a jeste toto toto se me stalo u main.cpp a vyresil jsem to
#include "main.moc" 
ted me to hlasi pro Kontakt List v mainwindow a uz sem skousel davat include "mainwindow.moc" i kontaktlist.moc (podle nazvu cpp) snad vsude kde se dalo na konce souboru postupne a nic nepomohlo, vsude radej pripojte tam ten soubor ale jak ho tam amm pripojit kdyz to stejne na to nereaguje? jeste doplnuji Qt creator je tvurce :-)
xkucf03 avatar 11.1.2012 19:42 xkucf03 | skóre: 49 | blog: xkucf03
Rozbalit Rozbalit vše Heslo!
Odpovědět | | Sbalit | Link | Blokovat | Admin
Upravil jsem tvůj dotaz, aby neobsahoval heslo (dalo se s ním přihlásit k účtu na GMailu). ;-)
Mám rád, když se lidé přou, znamená to, že vědí, co dělají, a že mají směr. Frantovo.cz, SQL-DK, Relational pipes
11.1.2012 20:21 Šangala | skóre: 56 | blog: Dutá Vrba - Wally
Rozbalit Rozbalit vše Re: Heslo!
Fakt že jo.
Pro "Aleš": ¡hned si to heslo změň!
To, že trpíš stihomamem, ještě neznamená, že po tobě nejdou. ⰞⰏⰉⰓⰀⰜⰉ ⰗⰞⰅⰜⰘ ⰈⰅⰏⰉ ⰒⰑⰎⰉⰁⰕⰅ ⰏⰉ ⰒⰓⰄⰅⰎ ·:⁖⁘⁙†
12.1.2012 15:47 Aleš
Rozbalit Rozbalit vše Re: Heslo!
děkuji ale jiz jak jsem to postoval jsem si uávedomil svojí silnou debilitu a zmenil jsem to :-D
12.1.2012 16:04 Šangala | skóre: 56 | blog: Dutá Vrba - Wally
Rozbalit Rozbalit vše Re: Heslo!
No to asi ne, včera 20:20 to bylo možné…
To, že trpíš stihomamem, ještě neznamená, že po tobě nejdou. ⰞⰏⰉⰓⰀⰜⰉ ⰗⰞⰅⰜⰘ ⰈⰅⰏⰉ ⰒⰑⰎⰉⰁⰕⰅ ⰏⰉ ⰒⰓⰄⰅⰎ ·:⁖⁘⁙†
12.1.2012 22:31 Aleš
Rozbalit Rozbalit vše Re: Heslo!
jo jo na gmailu jsem to udelal az na vase upozorneni na ten server jsem to zmenil ihned, jinak prosim na jakej gmail ucet jsi to zkosuelf prosim ono jich je hodne a ne vsechny jsem jistej ze jsem zmenil posli me prosim na email kde to bylo abych to mohl popripade jeste napravit a jeste jednou dekuji p ps.: muj email info@efadesigner.cz thx
13.1.2012 16:50 Šangala | skóre: 56 | blog: Dutá Vrba - Wally
Rozbalit Rozbalit vše Re: Heslo!
Neodpustím si ještě dovětek pro ty, co se dočtou až sem a neuvědomují si to:
  • Jakmile někde omylem unikne Vaše heslo nebo ho omylem zveřejníte na webu, byť na 5 minut a zvláště lze-li to spojit i s Vámi, okamžitě si jej změňte všude kde ho používáte (nikdy nevíte jak rychle je někde zaindexováno).
  • Nepoužívejte všude stejné heslo.
  • Texty jako helenka69 či pepa007, nejsou heslem i když je tak používáte…
:-)
To, že trpíš stihomamem, ještě neznamená, že po tobě nejdou. ⰞⰏⰉⰓⰀⰜⰉ ⰗⰞⰅⰜⰘ ⰈⰅⰏⰉ ⰒⰑⰎⰉⰁⰕⰅ ⰏⰉ ⰒⰓⰄⰅⰎ ·:⁖⁘⁙†

Založit nové vláknoNahoru

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.