Soutěž Pwn2Own Ireland 2026 skončila 9. října. Bezpečnostní výzkumníci získali celkem 1 262 000 dolarů na odměnách. Během soutěže bylo předvedeno zneužití 98 zero-day zranitelností. Testování zahrnovalo různé kategorie zařízení a software. Výzkumníci předváděli prakticky fungující útoky podle pravidel soutěže. Výsledky následně slouží výrobcům při přípravě oprav. Mezi pokořenými jsou: Samsung Galaxy S26, OpenAI Codex, Oracle Autonomous AI Database, Google Pixel 10, u iPhone 17 neuspěli.
Programovací jazyk Python byl vydán v nové verzi 3.15.0. Podrobný přehled novinek v aktualizované dokumentaci.
BIGWORDS.PAGE je open-source webová aplikace, která po otevření odkazu v prohlížeči vykreslí přes celou obrazovku jednoduché informační sdělení. Zpráva i její nastavení jsou uložené v části URL za znakem #, například odkaz https://bigwords.page/#abclinuxu zobrazí jako velký bílý nápis 'abclinuxu' na černém pozadí. Obsah odkazu lze upravovat i vestavěným editorem, ten umožňuje nastavovat formátování a vizuální efekty textu, časovače, QR kódy a obrázky. Zdrojový kód je dostupný pod licencí MIT na GitHubu.
V neděli 11. října proběhne rotace klíče kořenové zóny. Podruhé v historii. Ondřej Filip na blogu CZ.NIC: "Pokud je pro Vás DNS protokol spíše výzva, ale přesto spravujete nějakou síť či DNS resolver, zkuste si jednoduchý test, který připravila firma Cloudflare na této adrese. Obzvláště zbystřit byste měli, pokud uvidíte nějaká červená políčka."
Vláda Spojených států se rozhodla vyřadit americkou softwarovou společnost Microsoft a několik dalších velkých technologických podniků z programu, který umožňuje kvalifikovaným zahraničním pracovníkům získat povolení k trvalému pobytu. Oznámila to včera administrativa amerického prezidenta Donalda Trumpa. Opatření zdůvodnila rozsáhlým zneužíváním programu, který je dlouhodobě terčem kritiky ze strany Trumpových příznivců, neboť prý znevýhodňuje americké pracovníky.
Datové centrum největší ruské technologické společnosti Jandex v Rjazaňské oblasti se stalo cílem dronového útoku a zastavilo provoz. Jandexu se někdy přezdívá „ruský Google“. Provozuje nejoblíbenější internetový vyhledávač v Rusku nebo aplikace pro objednávky jídla a taxi. Využívají jej desítky milionů lidí v rusky mluvících zemích.
Francouzská společnost Mistral AI představila Mistral Large 4 (interně přezdívaný 'le Chonk', volně přeloženo 'pořádný macek'), 'open-weight multimodální hybridní instruct-and-reasoning model s architekturou granulárního MoE, nativně podporující více jak 160 jazyků'. Model má přes jeden bilión parametrů, z nichž při práci využívá 49 miliard, kontextové okno o délce milion tokenů a obrazový enkodér o 1,6 miliardách parametrů.
… více »Svobodný multiplatformní herní engine Bevy napsaný v Rustu byl vydán ve verzi 0.20. Díky 227 přispěvatelům.
Simon Long oznámil Raspberry Pi Desktop pro PC a Mac s Intelem postavený na aktualizovaném Debianu 13 Trixie. S klientem Raspberry Pi Connect pro vzdálenou správu. Ke stažení je vedle Raspberry Pi OS pro Raspberry Pi.
ESP32-C3 adblock přemění lacinou vývojovou desku ESP32‑C3 na samostatný DNS blokovač nejenom reklamních domén, minimalistickou alternativu k populárnímu Pi-hole. ESP32-C3 adblock místo objemných názvů domén ukládá jejich 40-bitové FNV-1a hashe do flash paměti, které pak binárně prohledává, kontrola jedné domény trvá přibližně 10 milisekund. Blocklist pojme až 537 tisíc domén a lze jej spravovat přes webové rozhraní. Projekt zatím
… více »Qt Designer nabízí vložení několika základních widgetů, ale co když si vytvoříme vlastní? Řekněme, že máme objekt Button založený na QPushButton – třeba tlačítko, které má reimplementované některé chráněné virtuální metody, jak jsme si ukazovali už v prvním díle – a teď jej chceme přidat do návrhu GUI.
Klikneme pravým tlačítkem myši do navrženého okna a poté na "Promoted widgets". Vyskočí (zatím) prázdný seznam upravených widgetů. U "Base class name" zvolte ze seznamu třídu, na které je váš widget založen, v tomto případě tedy QPushButton. Do "Promoted class name" pak přijde název vašeho objektu, což je Button. Automaticky se doplnil název hlavičkového souboru, který můžete v případě potřeby upravit. Asi není třeba zdůrazňovat, že vybraný hlavičkový soubor musí existovat a obsahovat třídu se zadaným názvem. Teď už stačí zmáčknout "Add" pro přidání a dialog zavřít.

Nyní si do okna přetáhněte Push Button, klikněte na něj pravým tlačítkem myši a zvolte z nabídky "Promote to..." položku Button.

A to je vše, tímto krokem jste klasické tlačítko "povýšili" (promote) na váš objekt "Button".
Signály a sloty mezi widgety lze propojovat rovnou v Designeru a je to velmi snadné, takže se podíváme, jak na to.
Nejjednodušší případ nastane, když chceme propojit dva standardní widgety. Přidejme si do návrhu Horizontal Slider (QSlider, horizontální posuvník) a Spin Box (QSpinBox, číselník). Přepneme se pomocí F4 do režimu editace signálů/slotů.

A nyní je propojíme tak, aby se změna hodnoty na jednom widgetu projevila i na tom druhém. Chytneme posuvník a přetáhneme jej na číselník.
![]()
Poté, co jsme pustili tlačítko myši, vyskočil dialog, ve kterém nastavíme, co vlastně chceme propojit.

Stejně pak propojíme i signál číselníku se slotem posuvníku, čímž vznikne toto spojení:

Pokud byste v Designeru chtěli propojit signály a sloty vlastních widgetů, tak vězte, že mu o nich nejdřív musíte dát vědět. Například kdyby výše uvedené tlačítko Button mělo signál exploded(int,int), tak při propojování s jiným widgetem stisknete tlačítko "Edit..." a signál si do seznamu přidáte:

Drag & drop (v doslovném překladu "táhni a pusť"), když je řeč o grafickém uživatelském rozhraní (GUI), odkazuje na akci, při které uživatel chytí nějaký widget kurzorem myši (například položku seznamu) a přetáhne jej na jiný widget (například jiný seznam) nebo na jiné místo ve widgetu původním. Například když v grafickém správci souborů přesouváte soubor tažením do jiného adresáře.
Nyní si ukážeme, jak pro něco takového přidat podporu do naší Qt 4 aplikace. Aby toto mohlo fungovat, je třeba mít implementovaný drag na widgetu, ze kterého se chceme přetahovat (což je v následující ukázce MyDirView) a drop na widgetu, na který tažená data pouštíme (MyListWidget).
mydirview.h
#ifndef MYDIRVIEW_H #define MYDIRVIEW_H #include <QTreeView> class MyDirView : public QTreeView { public: MyDirView(QWidget* = 0); private: QPoint dragStartPosition; protected: void mousePressEvent(QMouseEvent*); void mouseMoveEvent(QMouseEvent*); }; #endif // MYDIRVIEW_H
mydirview.cpp: Musíme widgetu implementovat drag, což obvykle obnáší minimálně 2 virtuální metody: mousePressEvent() a mouseMoveEvent().
#include "mydirview.h"
#include <QApplication>
#include <QDirModel>
#include <QDrag>
#include <QMimeData>
#include <QMouseEvent>
MyDirView::MyDirView(QWidget* parent) : QTreeView(parent)
{
// zobrazí adresářovou strukturu
setModel(new QDirModel(this));
}
// událost stisknutí tlačítka myši
void MyDirView::mousePressEvent(QMouseEvent* event)
{
// nejdřív zavoláme std. implementaci této události
QTreeView::mousePressEvent(event);
// v případě stisknutí levého tlačítka myši
// uloží aktuální pozici kurzoru
if(event->button() == Qt::LeftButton)
dragStartPosition = event->pos();
event->accept();
}
// událost pohybu kurzoru myši
void MyDirView::mouseMoveEvent(QMouseEvent* event)
{
// nezahájíme drag, pokud není drženo levé tlačítko
if (!(event->buttons() & Qt::LeftButton))
return;
// nezahájíme drag, pokud se kurzor od stisknutí levého tlačítka
// nepohnul alespoň o QApplication::startDragDistance()
if ((event->pos() - dragStartPosition).manhattanLength() < QApplication::startDragDistance())
return;
// získáme index buňky pod kurzorem
QModelIndex index = indexAt(event->pos());
// nezahájíme drag, pokud pod kurzorem není buňka
// tzn. pokud index není validní
if(!index.isValid())
return;
// vytvoříme si objekt pro drag
QDrag* drag = new QDrag(this);
// a sem uložíme informace, které potřebujeme přenést
QMimeData* mime = new QMimeData;
// přenášíme text obsažený v přetahované buňce
mime->setText( index.data().toString() );
drag->setMimeData(mime);
// zahájíme drag
drag->exec(Qt::CopyAction);
}
mylistwidget.h
#ifndef MYLISTWIDGET_H
#define MYLISTWIDGET_H
#include <QListWidget>
class MyListWidget : public QListWidget
{
public:
MyListWidget(QWidget* = 0);
protected:
void dropEvent(QDropEvent*);
void dragEnterEvent(QDragEnterEvent*);
void dragMoveEvent(QDragMoveEvent*);
};
#endif // MYLISTWIDGET_H
mylistwidget.cpp: implementace dropu na widget spočívá v samotném povolení dropu pomocí metody setAcceptDrops(true) a v následné reimplementaci virtuálních metod dragEnterEvent() a dropEvent(). U komplexnějších widgetů je třeba reimplementovat i dragMoveEvent() – zda je to třeba poznáte celkem snadno, protože drop zkrátka nebude fungovat.
#include "mylistwidget.h"
#include <QDropEvent>
MyListWidget::MyListWidget(QWidget* parent) : QListWidget(parent)
{
// povolíme drop na tento widget
setAcceptDrops(true);
}
// událost: drag najede na widget
void MyListWidget::dragEnterEvent(QDragEnterEvent *event)
{
// pouze přijmeme navrhovanou akci
event->acceptProposedAction();
}
// událost: drag se pohnul nad widgetem
void MyListWidget::dragMoveEvent(QDragMoveEvent* event)
{
// opět jen přijmeme navrhovanou akci
event->acceptProposedAction();
}
// událost drop (puštění dragu na widget)
void MyListWidget::dropEvent(QDropEvent* event)
{
// získáme text z informací o události (event)
QString text = event->mimeData()->text();
// pokud text není prázdný, přidáme jej jako položku do seznamu
if(!text.isEmpty())
addItem(event->mimeData()->text());
}
main.cpp: Do okna vložíme naše dva widgety vedle sebe.
#include <QApplication>
#include <QWidget>
#include <QHBoxLayout>
#include "mydirview.h"
#include "mylistwidget.h"
class MainWindow : public QWidget
{
public:
MainWindow()
{
// vytvoříme horizontální rozložení
QHBoxLayout* layout = new QHBoxLayout(this);
// a vložíme do něj naše widgety
layout->addWidget(new MyDirView);
// 1. widget se bude roztahovat
layout->setStretch(0, 1);
layout->addWidget(new MyListWidget);
setLayout(layout);
}
};
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
MainWindow window;
window.show();
return app.exec();
}
Zkuste si tuto ukázku sestavit, spustit a pozměnit události dragu a dropu. Můžete také zkusit implementovat drag & drop jiným widgetům. Přetahovat nemusíte zdaleka jen text, ale prakticky jakákoliv data.
Tray ikona může být užitečná u programů, u kterých se očekává, že budou spuštěné delší dobu, jako třeba multimediální přehrávače či IM klienti. Následující widget je ukázkou toho, jak pro program vytvořit tray ikonu, jak této ikoně přiřadit kontextovou nabídku a jak volitelně skrývat okno do traye při jeho zavření.
widget.h
#ifndef WIDGET_H
#define WIDGET_H
#include <QCheckBox>
#include <QSystemTrayIcon>
// widget založený na zaškrtávacím poli
class Widget : public QCheckBox
{
Q_OBJECT
public:
Widget();
private:
QSystemTrayIcon* tray;
protected:
void closeEvent(QCloseEvent*);
private slots:
void trayClicked(QSystemTrayIcon::ActivationReason);
};
#endif // WIDGET_H
widget.cpp
#include "widget.h"
#include <QApplication>
#include <QCloseEvent>
#include <QDebug>
#include <QMenu>
#include <QStyle>
Widget::Widget()
{
// nastaví text vedle zaškrtávacího pole
setText(tr("Hide on close"));
// ve výchozím stavu bude zaškrtnuté
setChecked(true);
// nastavíme pevnou šířku na 200px
setFixedWidth(200);
// vytvoříme objekt tray ikony a jako ikonu nastavíme std. ikonu
// domovského adresáře poskytnutou aktuálním stylem
tray = new QSystemTrayIcon(style()->standardIcon(QStyle::SP_DirHomeIcon), this);
// propojíme aktivaci tray ikony (kliknutí) s naším handlerem
connect(tray, SIGNAL(activated(QSystemTrayIcon::ActivationReason)),
this, SLOT(trayClicked(QSystemTrayIcon::ActivationReason)));
// vytvoříme menu...
QMenu* menu = new QMenu(this);
// s položkou "Quit" pro ukončení programu
QAction* actionQuit = menu->addAction(tr("Quit"));
connect(actionQuit, SIGNAL(triggered()), qApp, SLOT(quit()));
// nastavíme vytvořené menu tray ikoně
tray->setContextMenu(menu);
// zobrazíme tray ikonu
tray->setVisible(true);
// pokud není tray oblast dostupná, vypíšeme to do konzole
if(!QSystemTrayIcon::isSystemTrayAvailable())
qDebug() << "System tray is not available right now";
}
// slot propojený s kliknutím na tray ikonu
void Widget::trayClicked(QSystemTrayIcon::ActivationReason reason)
{
// kliknutí na tray ikonu aplikaci zobrazí/skryje
if(reason == QSystemTrayIcon::Trigger)
isHidden() ? show() : hide();
}
// událost zavření okna
void Widget::closeEvent(QCloseEvent* event)
{
// pokud je zaškrtávací pole zaškrtnuté a tray ikona zobrazená
if(isChecked() && tray->isVisible())
{
// zobrazíme na 1000 milisekund bublinu s informací, že program stále běží
tray->showMessage(tr("Message"), tr("The application has been hidden, not closed!"),
QSystemTrayIcon::Information, 1000);
// okno skryjeme a událost ignorujeme
hide();
event->ignore();
}
// jinak se provede std. akce a okno se zavře (a program se ukončí)
}
Jednoduchý program:

Tray ikona s informativní bublinou, která říká, že program nebyl ukončen.

Tohle je pro dnešek vše. V příštím díle si mj. povíme něco o regulárních výrazech (a o kontrole vstupních polí s jejich pomocí), vláknech a ukážeme si použití ukazatele průběhu.
Nástroje: Tisk bez diskuse
Tiskni
Sdílej:
)
Vsiml jsem si, ze tento serial ma jenom 4 dily a bohuzel neodpovedel na otazku, na niz dosud neznam odpoved :( Obracim se proto na ctenare v nadeji, ze nekdo z vas dokaze poradit:
Mam graficke uzivatelske rozhrani v QT a databazi v SQLite (pravdepodobne UTF-8). Kdyz vytahnu data z databaze, prekoduji je pomoci prikazu "fromLocal8Bit" a vypisu do pole typu PlainTextEdit, diakritika se zobrazi spravne. Kdyz vsak chci data prekodovat zpatky (pouziji prikaz toLocal8Bit), data se jiz spravne neprekoduji :(
Priklad: V databazi je ulozeno slovo "kočka", kdyz to vytahnu z databaze a vypisu, tak se vypise "koeka" (nad "e" je obracena carka), kdyz slovo prekoduji opmoci "fromLocal8Bit" a vypisu, do GUI se mne vypise "kočka". Jakmile tohle slovo opet nactu a prekoduji pomoci "toLocal8Bit", tak bych mel opet dostat "koeka" (s obracenou carkou nad "e"), ne? Ale ja ziskam slovo "ko?ka".
Poradite mne nekdo, prosim? PS: testuji to pod XPckama.
Kdyz nactu text ze souboru, tak v pripade slova "kočka" se v TextEditu objevi "koeka" (s obracenou carkou nad e), pokud nepouziju "fromLocal8Bit" a az pak to nevypisu.
Kdyz mam v TextEditu napsano "koeka" (s obracenou carkou nad e) a tohle slovo nactu a predam databazi, tak se mne vyhleda v databazi jeho ekvivalent. Pokud je v TextEditu slovo spravne (kočka) a ja toto spravne zapsane slovo predam databazi, tak se jeho ekvivalent nevyhleda.
A je nekde k dispozici? Prip. nedala by se nejaka funkce pouzit uz pro existujici textEdit?
a kdyz pouziji "fromLocal8Bit", tak do ceho se to prekoduje? Do UTF-8 nebo UTF-16 nebo do neceho jinyho? A kdyz budu chtit pouzivat i jine abecedy nez jen ceskou (napr. azbuku), tak budu muset vyuzivat UTF-16, ze?
vyborny serial 
chel by so msa spytat, ci bude aj nejaky sample na jednoduchu komunikaciu s DB ci uz mysql alebo sqllite
Ještě nevím přesně kdy ho zařadíme. Nicméně dočkáš se.
vyborne, tesim sa 
Qt je skvělá knihovna a jsem rád, že se někdo věnuje její propagaci.
este ma tak napadlo, nepamatam sa ci uz si to v tomto serialy nespomenul.
ladenie aplikacie, debugovanie (mozne nastroje), logging, optimalizacia (da sa niekde sledovat pamatova narocnost, pripadne odhalit memory leaks ? )
doplnujuca otazka este (mozno bude fakt blba
ale kdyz jsem blbej tak se zeptam
), naco vlastne dve verzie kazdek kniznice (release a debug) ?
naco vlastne dve verzie kazdek kniznice (release a debug) ?To si vybereš který verze chceš stavět. Debug má debugovací symboly (binárka se nestripne) + zahrne debug kód, tzn. různý asserty a takhle. Když debuguješ, tak to použij. Release je rychlejší, ale když to pustíš v gdb, dozvíš se celkem prd.
a ten logging ?
logovanie (zapisovanie napriklad do suboru, db... alebo co), co sa deje v aplikacii
priklad pokazi sa nieco, napriklad kdesi vyskoci exception, tak ju "zaloggujes", aby si vedel ze sa nieco posralo
]).
Předpokládám, že nebude problém zpětně dešifrovat, jak se nahradila odvozená třída za původní (via položka v menu promote_to...), na Inetu návodů JakNATO je docela dost.
Hodně úspěchů.
J.