Byla vydána verze 4.0.0 programovacího jazyka Ruby (Wikipedie). S Ruby Box a ZJIT. Ruby lze vyzkoušet na webové stránce TryRuby. U příležitosti 30. narozenin, první veřejná verze Ruby 0.95 byla oznámena 21. prosince 1995, proběhl redesign webových stránek.
Všem čtenářkám a čtenářům AbcLinuxu krásné Vánoce.
Byla vydána nová verze 7.0 linuxové distribuce Parrot OS (Wikipedie). S kódovým názvem Echo. Jedná se o linuxovou distribuci založenou na Debianu a zaměřenou na penetrační testování, digitální forenzní analýzu, reverzní inženýrství, hacking, anonymitu nebo kryptografii. Přehled novinek v příspěvku na blogu.
Vývojáři postmarketOS vydali verzi 25.12 tohoto před osmi lety představeného operačního systému pro chytré telefony vycházejícího z optimalizovaného a nakonfigurovaného Alpine Linuxu s vlastními balíčky. Přehled novinek v příspěvku na blogu. Na výběr jsou 4 uživatelská rozhraní: GNOME Shell on Mobile, KDE Plasma Mobile, Phosh a Sxmo.
Byla vydána nová verze 0.41.0 multimediálního přehrávače mpv (Wikipedie) vycházejícího z přehrávačů MPlayer a mplayer2. Přehled novinek, změn a oprav na GitHubu. Požadován je FFmpeg 6.1 nebo novější a také libplacebo 6.338.2 nebo novější.
Byla vydána nová verze 5.5 (novinky) skriptovacího jazyka Lua (Wikipedie). Po pěti a půl letech od vydání verze 5.4.
Byla vydána nová verze 5.4.0 programu na úpravu digitálních fotografií darktable (Wikipedie). Z novinek lze vypíchnout vylepšenou podporu Waylandu. Nejnovější darktable by měl na Waylandu fungovat stejně dobře jako na X11.
Byla vydána beta verze Linux Mintu 22.3 s kódovým jménem Zena. Podrobnosti v přehledu novinek a poznámkách k vydání. Vypíchnout lze, že nástroj Systémová hlášení (System Reports) získal mnoho nových funkcí a byl přejmenován na Informace o systému (System Information). Linux Mint 22.3 bude podporován do roku 2029.
GNU Project Debugger aneb GDB byl vydán ve verzi 17.1. Podrobný přehled novinek v souboru NEWS.
Josef Průša oznámil zveřejnění kompletních CAD souborů rámů tiskáren Prusa CORE One a CORE One L. Nejsou vydány pod obecnou veřejnou licenci GNU ani Creative Commons ale pod novou licencí OCL neboli Open Community License. Ta nepovoluje prodávat kompletní tiskárny či remixy založené na těchto zdrojích.
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.
pak jsem dal opet ctrl+r pro kompilaci a hups byli tito chyby v moc souboru main.moc
a na google jsem si stim nejak moc neporadil pokud by nekdo mel radu dekuji
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
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?
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.
window->close();a bylo vystarano ale to nemohu udelat v najake funkci kdyz je to ve tride uplne nekde jinde
a destruktor me na to nefunguje
jinak dialog je fakt lepsi :)
takze me jeste asi chvilku potrva nez to cele pochopim takze dekuji za schovyvavost.
#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: