Na čem aktuálně pracují vývojáři GNOME a KDE Plasma? Pravidelný přehled novinek v Týden v GNOME a Týden v KDE Plasma.
FlappyFavi, hra Flappy Bird v ikoně Favicon. Nefunguje na mobilech.
Byly vyhlášeny výsledky (YouTube) 28. ročníku D.I.C.E. (Design, Innovate, Communicate, Entertain) Awards: Hrou roku 2024 je Astro Bot.
Všem na AbcLinuxu vše nejlepší k Valentýnu aneb Dni lásky ke svobodnému softwaru (I love Free Software Day, Mastodon, 𝕏).
Vývojáři openSUSE Tumbleweed oznámili, že u nových instalací se ve výchozím stavu přechází z AppArmor na SELinux. Uživatelé, kteří chtějí zůstat na AppArmor si mohou AppArmor vybrat v instalátoru.
Hector "marcan" Martin skončil jako vedoucí projektu Asahi Linux aneb Linux na Apple Siliconu. Projekt ale pokračuje dál.
PostgreSQL byl vydán ve verzích 17.3, 16.7, 15.11, 14.16 a 13.19. Řešena je zranitelnost CVE-2025-1094 s CVSS 8.1 a více než 70 chyb.
Dnes je Světový den rádia. Použili jste někdy GNU Radio?
Před 33 lety, ve čtvrtek 13. února 1992, se tehdejší Česká a Slovenská Federativní Republika oficiálně (a slavnostně) připojila k Internetu.
Byla vydána nová verze 9.10 z Debianu vycházející linuxové distribuce DietPi pro (nejenom) jednodeskové počítače. Přehled novinek v poznámkách k vydání.
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:
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.
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
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); };
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?
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.
window->close();a bylo vystarano ale to nemohu udelat v najake funkci kdyz je to ve tride uplne nekde jinde
#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?
#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
Tiskni
Sdílej: