Software Freedom Conservancy v novém dokumentu shrnuje doporučení, jak přistupovat ke generativní AI založené na LLM při přispívání do svobodného a open-source softwaru. Mimo jiné vyzývá k obezřetnosti, transparentnosti a revizi generovaného kódu člověkem.
Byla vydána nová verze 5.6.0 programu na úpravu digitálních fotografií darktable (Wikipedie).
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. V Týdnu v GNOME je zmíněn flatpak balíček pro GIMP 0.54.1 z roku 1996. Jedná se o poslední verzi GIMPu postavenou nad toolkitem Motif.
Home Assistant Operating System, tj. linuxová distribuce optimalizována pro hostování Home Assistanta a jeho aplikací, byl vydán v nové major verzi 18.0.
Po šestiletém úsilí byla z jádra Linux odstraněna funkce strncpy(). Všechna předchozí volání této funkce byla převedena na bezpečnější alternativy.
Byla vydána nová verze 261 správce systému a služeb systemd (Wikipedie, GitHub). Z novinek lze vypíchnout nový subsystém IMDS (Cloud "Instance Metadata Service"), nový příkaz storagectl nebo novou komponentu systemd-sysinstall.
Vývojové prostředí Qt Creator bylo vydáno ve verzi 20 (seznam změn). Novinky zahrnují hlavně rozšíření pro integraci LLM agentů nebo minimalistický editační režim uživatelského rozhraní („zen mode“).
Už jste se prolétli na webu Google Earth? Přibyl tam Simulátor letu (Nástroje / Simulátor letu). Funguje i bez účtu Google [𝕏].
Byla vydána nová verze 4.7 (𝕏, Bluesky, Mastodon) multiplatformního open source herního enginu Godot (Wikipedie, GitHub). Přehled novinek i s náhledy v příspěvku na blogu.
Mastodon (Wikipedie) - sociální síť, která není na prodej - byl vydán ve verzi 4.6. Přehled novinek s náhledy v oznámení na blogu.
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: