Dnes a zítra probíhá vývojářská konference Google I/O 2025. Sledovat lze na YouTube a na síti 𝕏 (#GoogleIO).
V Bostonu probíhá konference Red Hat Summit 2025. Vybrané přednášky lze sledovat na YouTube. Dění lze sledovat na síti 𝕏 (#RHSummit).
Společnost Red Hat oficiálně oznámila vydání Red Hat Enterprise Linuxu 10. Vedle nových vlastností přináší také aktualizaci ovladačů a předběžné ukázky budoucích technologií. Podrobnosti v poznámkách k vydání.
Tuto sobotu 24. května se koná historicky první komunitní den projektu Home Assistant. Zváni jsou všichni příznivci, nadšenci a uživatelé tohoto projektu. Pro účast je potřebná registrace. Odkazy na akce v Praze a v Bratislavě.
Troy Hunt představil Have I Been Pwned 2.0, tj. nový vylepšený web služby, kde si uživatelé mohou zkontrolovat, zda se jejich hesla a osobní údaje neobjevili v únicích dat a případně se nechat na další úniky upozorňovat.
Microsoft představil open source textový editor Edit bežící v terminálu. Zdrojové kódy jsou k dispozici na GitHubu pod licencí MIT.
V Seattlu a také online probíhá konference Microsoft Build 2025. Microsoft představuje své novinky. Windows Subsystem for Linux je nově open source. Zdrojové kódy jsou k dispozici na GitHubu pod licencí MIT.
Z příspěvku Turris Sentinel – co přinesl rok 2024 na blogu CZ.NIC: "Za poslední rok (únor 2024 – únor 2025) jsme zachytili 8,3 miliardy incidentů a to z 232 zemí a z jejich závislých území. Tyto útoky přišly od 6,2 milionu útočníků (respektive unikátních adres). SMTP minipot je stále nejlákavější pastí, zhruba 79 % útoků bylo směřováno na tento minipot, 16 % útoků směřovalo na minipot Telnet, 3 % útoků směřovaly na minipot HTTP a 2 % na minipot FTP. Dále jsme zaznamenali 3,2 milionu unikátních hesel a 318 tisíc unikátních loginů, které útočníci zkoušeli."
Byla vydána (Mastodon, 𝕏) nová verze 3.0.4 svobodné aplikace pro úpravu a vytváření rastrové grafiky GIMP (GNU Image Manipulation Program). Přehled novinek v oznámení o vydání a v souboru NEWS na GitLabu. Nový GIMP je již k dispozici také na Flathubu.
Byla vydána nová stabilní verze 7.4 webového prohlížeče Vivaldi (Wikipedie). Postavena je na Chromiu 136. Přehled novinek i s náhledy v příspěvku na blogu.
Tento seriál je určený pro lidi s alespoň základními znalostmi C++ (třídy a dědičnost, ukazatele atp.). Cílem je naučit základy programování grafických aplikací za použití vývojového frameworku Qt 4 a předvést různé možnosti tohoto frameworku. Seriál se bude zabývat nejen ručním programováním, ale později si ukážeme i použití Qt Designeru pro návrh GUI.
Na první verzi Qt – vyslovuje se jako anglické cute (roztomilý), tedy [kju:t] – se začalo pracovat již v roce 1991 a od té doby se framework stále rozšiřuje a zlepšuje. O 3 roky později dva z vývojářů založili společnost Trolltech. V polovině roku 2008 byl Trolltech zakoupen společností Nokia a krátce na to přejmenován na Qt Software. Celý framework je již od nepaměti dostupný zdarma pod licencí GPL nebo za poplatek pro komerční použití. Od verze 4.5.0, která vyjde v březnu 2009, bude Qt dostupná i pod licencí LGPL.
V současnosti Qt používá například populární desktopové prostředí KDE, VoIP komunikátor Skype, webový prohlížeč Opera, virtualizační software VirtualBox a spousty dalších aplikací.
Qt 4 běží nejen na unixových operačních systémech (Linux, BSD), Windows a Mac OS X, ale i na nejrůznějších mobilních zařízeních. Alespoň co se týče Linuxu, sestavit lze na všech možných i nemožných platformách, včetně x86, x86-64, IA64, SPARC, MIPS, Alpha, HPPA a PPC (32 i 64bitová).
Minimálně pro menší programy je vhodné nechat si vygenerovat Makefile pomocí qmake
, což je utilita obsažená v Qt. Postup je snadný:
qmake -project
, který vygeneruje soubor s příponou .pro
.qmake
bez argumentů. Tím vygenerujete Makefile.make
.Při programování v Qt 4 máte k dispozici množství tříd (objektů), které můžete používat tak, jak jsou, nebo je v případě specifických potřeb zdědit ve vlastní třídě a následně upravit podle sebe.
#include <QApplication> #include <QLabel> int main(int argc, char** argv) { QApplication app(argc, argv); QLabel win("Hello World!"); win.show(); return app.exec(); }
V každém grafickém programu je třeba vytvořit instanci třídy QApplication, které se předávají argumenty z příkazové řádky. Na konci programu je vhodné vracet výsledek její metody exec()
. Ve funkci main()
je vhodné vytvářet objekty ve stacku.
Mezi těmito dvěma body se nachází kód, který zobrazí hlavní okno programu. Hlavním oknem programu může být jakákoliv třída dědící QWidget nebo právě QWidget samotný. Obvykle se zde pouze vytvoří instance třídy hlavního okna a zavolá se její metoda show()
, která okno zobrazí. Případně lze ještě zavést lokalizaci.
Signály a sloty slouží ke komunikaci mezi objekty Qt. Signály objekty Qt vyšlou, když dojde k určité události. Signál je zvláštní metoda, která nemá tělo a nevrací hodnotu, má pouze prototyp. Slot je metoda, která se zavolá v reakci na nějaký signál. Slot se od běžné metody liší pouze tím, že jej lze nastavit jako reakci na vyslaný signál; můžete ho ovšem volat i vy sami. Signál může slotu předat libovolný počet argumentů libovolného typu (dle předem dané definice, samozřejmě).
V následujícím programu je tlačítko (QPushButton) propojeno s hlavním oknem aplikace (QApplication; qApp
je ukazatel na instanci této třídy, která je pro každý program unikátní). K propojení slouží metoda connect()
třídy QObject. Tato metoda je přetížená, takže se může volat s různými argumenty, ale nejčastěji se používá varianta, kterou vidíte v ukázce níže, tedy v tomto pořadí:
#include <QApplication> #include <QPushButton> int main(int argc, char** argv) { QApplication app(argc, argv); QPushButton btn("&Quit"); QObject::connect(&btn, SIGNAL(clicked()), qApp, SLOT(quit())); btn.show(); return app.exec(); }
Třída QObject je základem veškerých objektů v Qt, takže uvnitř jakékoliv Qt třídy můžete QObject::, které vidíte v mém příkladu, bez starostí vynechat.
Všimněte si ampersandu uvnitř řetězce v konstruktoru QPushButton. Ten se po spuštění programu nezobrazí, ale místo toho Qt zaregistruje jemu následující znak jako klávesovou zkratku pro výchozí činnost. Stisknutí Alt+Q by tedy mělo ukončit program.
Jak jsem již psal, libovolnou třídu Qt můžete zdědit a upravit si ji podle sebe. V následujícím příkladu vytvořím třídu MyObject
založenou na QWidget, která poslouží jako hlavní okno programu. Je zde tlačítko a zaškrtávací políčko (QCheckBox). Tyto dva ovládací prvky (widgety) jsou funkcí connect()
propojeny tak, že když kliknete na jeden z nich, aktivuje se i ten druhý. Oba widgety jsou po propojení přidány do horizontálního rozložení (layoutu), který poskytuje třída QHBoxLayout. Layouty slouží k uspořádání rozmístění ovládacích prvků a bez nich by bylo nutné udávat souřadnice každého widgetu, což je velmi nepraktické.
#include <QHBoxLayout> #include <QCheckBox> #include <QPushButton> class MyObject : public QWidget { public: /* jako poslední argument konstruktoru je třeba předat rodiče - v případě, že jde o hlavní okno, se předá nula (žádný rodič) */ MyObject(QWidget* parent = 0); }; MyObject::MyObject(QWidget*) { QHBoxLayout* myLayout = new QHBoxLayout(this); QPushButton* pb = new QPushButton(tr("Check this")); QCheckBox* cb = new QCheckBox(); // tlačítko lze zamáčknout pb->setCheckable(true); connect(pb, SIGNAL(clicked()), cb, SLOT(toggle())); connect(cb, SIGNAL(clicked()), pb, SLOT(toggle())); myLayout->addWidget(pb); myLayout->addWidget(cb); // použije daný layout setLayout(myLayout); }
Ve třídách již vytváříme objekty v heapu (tzn. pomocí operátoru new
). Na první pohled to vypadá, jako když jsem zapomněl na destruktor, ve kterém bych smazal takto vytvořené objekty, ale není tomu tak. Tím, že jsem při vytváření layoutu nastavil jeho rodiče na this
(tj. ukazatel na aktuální instanci třídy), jsem zajistil, že se Qt postará o jeho smazání při ničení instance nadřazené třídy (v tomto případě MyObject
). Všechny widgety obsažené v layoutu jsou smazány při jeho destrukci, takže jsme na nic nezapomněli. Zrovna hlavní okno sice není nejlepším příkladem, jelikož se ničí až při ukončení programu, nicméně stejně to funguje u všech Qt objektů. Obvykle je destruktory nutné psát jen v případě, že uvnitř programu používáte nějakou externí knihovnu.
Při vytváření tlačítka jsem jeho text vložil do funkce QObject::tr()
, čímž jsem řetězec označil pro překlad (lokalizaci). Takto je vhodné označovat všechny řetězce, které jsou viditelné uživateli.
Pro použití tohoto objektu jednoduše zkopírujte jeho kód nad funkci main()
, kterou si můžete vzít třeba z některého z předchozích příkladů. Vytvořte instanci objektu a pak okno zobrazte tak, jak jsem popisoval výše.
Ukázková třída výše byla velice jednoduchá a neobsahovala žádné metody. Nyní si ukážeme, jak napsat vlastní signál a slot a rovnou přidáme ukázku vlastní implementace chráněné metody. Tento program se skládá z více souborů.
mybutton.h
: Hlavičkový soubor objektu založeného na tlačítku QPushButton. Pokud chcete ve třídě definovat vlastní signál nebo slot, musíte na začátek (resp. do "private" sekce) vložit makro Q_OBJECT
, protože nejde o standardní syntaxi C++.
#ifndef MYBUTTON_H #define MYBUTTON_H #include <QFont> #include <QPushButton> class MyButton : public QPushButton { Q_OBJECT public: MyButton(QPushButton* parent = 0); private: int m_stretch; int m_counter; QFont font; protected: // reimplemetace zavedené metody pro událost dvojkliku virtual void mouseDoubleClickEvent(QMouseEvent*); public slots: void vStretch(); // nastaví o kolik se má tlačítko roztáhnout void setStretch(int); signals: // tlačítko bylo horizontálně zvětšeno void hStretched(); }; #endif
mybutton.cpp
: Implementace našeho tlačítka.
#include "mybutton.h" #include <QMouseEvent> MyButton::MyButton(QPushButton* parent) : QPushButton(parent), m_stretch(10), m_counter(0) { // nastaví výchozí text setText("Dvojklikni sem!"); // nastaví výchozí velikost setFixedSize(200, 50); // signál hStretched() spustí slot vStretch() connect(this, SIGNAL(hStretched()), SLOT(vStretch())); } void MyButton::mouseDoubleClickEvent(QMouseEvent* e) { // ignorujeme dvojkliky jiným než levým tlačítkem myši if(e->buttons() != Qt::LeftButton) return; // horizontálně roztáhne tlačítko setFixedWidth(width()+m_stretch); // přepne tučnost písma font.setBold(!font.bold()); setFont(font); // změní text na tlačítku na počet dvojkliků setText(QString("%1x").arg(++m_counter)); // vyšle signál emit hStretched(); } void MyButton::vStretch() { // vertikálně roztáhne tlačítko setFixedHeight(height()+(m_stretch/2)); } void MyButton::setStretch(int stretch) { if(stretch < 2) stretch = 2; if(stretch > 50) stretch = 50; m_stretch = stretch; }
main.cc
: Hlavní okno (MyWindow
) bude obsahovat upravené tlačítko MyButton
a číselník QSpinBox, kterým se bude volit, o kolik se má tlačítko při dvojkliku (na tlačítko) roztáhnout.
#include <QApplication> #include <QWidget> #include <QSpinBox> #include <QHBoxLayout> #include "mybutton.h" class MyWindow : public QWidget { public: MyWindow(QWidget* parent = 0); }; MyWindow::MyWindow(QWidget* parent) : QWidget(parent) { QHBoxLayout* layout = new QHBoxLayout(this); MyButton* button = new MyButton(); QSpinBox* spinBox = new QSpinBox(); // nastaví rozsah číselníku spinBox->setRange(2, 50); // nastaví výchozí hodnotu číselníku spinBox->setValue(10); // když se změní hodnota číselníku, odešleme ji tlačítku connect(spinBox, SIGNAL(valueChanged(int)), button, SLOT(setStretch(int))); layout->addWidget(button); layout->addWidget(spinBox); setLayout(layout); } int main(int argc, char** argv) { QApplication app(argc, argv); MyWindow w; w.show(); // qApp je globální ukazatel na instanci QApplication // qApp->exec() je zde totéž jako app.exec() return qApp->exec(); }
Stejného chování objektu MyButton
by se jistě dalo docílit efektivnějším způsobem (mohl bych vStretch()
volat sám z mouseDoubleClickEvent()
nebo rovnou použít metodu setFixedSize()
), pointa této ukázky byla ovšem předvést několik možností, jak lze přistupovat k řešení jistých situací. Proto jsem předělal událost dvojkliku tak, aby zvětšila šířku tlačítka a poté vyslala signál, že bylo tlačítko roztaženo. Jelikož je tento signál propojen se slotem vStretch()
, tak toto horizontální roztažení okamžitě následovalo roztažení vertikální.
Číselník v hlavním okně při změně odesílá svou hodnotu našemu tlačítku, které si ji ve slotu uloží do proměnné m_stretch
.
A to je pro dnešek vše. Příště si mj. ukážeme, jak vytvořit hlavní okno a jak ukládat a načítat nastavení programu.
Nástroje: Tisk bez diskuse
Tiskni
Sdílej:
+1 Taky držím palce a doufám že z toho bude seriál (aby to nezůstalo u návodu typu "uděláme si okno s tlačítkem", kterých je všude spousta).
Zajímavé by bylo i porovnání dvou přístupů signály+sloty vs. posluchače (např. v Javě -- ve Swingu).
+1 tiez vazne potrebujem , miestami som sa rozhodoval ze pre svoju linuxovu verziu programu neurobim gui nakoniec som neurobil ani na win a je to iba konsole :)
S Qt trosku experimentuji, takze se tesim na pokracovani, ze se dozvim neco noveho, zajimaveho
Konečně jsem se dočkál :). Díky za skvělý seriál. Už se nemůžu dočkát dalšího dílu.
MyObject(QWidget* parent = 0);
C++ umí výchozí hodnoty argumentů?
V uvode by som este rozpisal, ktore subory treba downloadnut aby som mohol zacat robit QT sw.
A co tak original baliky z http://www.qtsoftware.com/downloads/opensource/appdev/linux-x11-cpp
Myslim ze to je univerzalnejsie riesenie.
Konecne neco zajimavyho - super clanek
Jak jsem již psal, libovolnou třídu Qt můžete zdědit a upravit si ji podle sebe. V následujícím příkladu vytvořím třídu MyObject založenou na QWidget, která poslouží jako hlavní okno programu.Možná by bylo vhodnější začít rovnou hlavním oknem založeným na QMainWindow...
Qt jsem uz vicekrat pouzil a opravdu se mi libi, sloty jsou sice zasah do syntaxe C++, ale je to elegantni.
Qt miluju a dela z C++ dobrou platformu, naopak MFC pro Windows nenavidim.
Radeji delam GUI programy v Jave nebo kdyztak v C#, ale pouziti Qt s C++ je stejne elegantni.
kdyz uz jste to s temi sloty nakousl - prepisovani anglickych podkladu do cestiny je zasluzna prace, ale vede to k tomu, ze se nedovime, proc je signal/slot mechanismus elegantni a jake vyhody a nevyhody ma vuci jinym mechanismum jako napr. target/message a callback. Ale mozna se to dovime v diskuzi.
nejde mi o prepisovani dokumentace ani o rozvlacne popisy.
pouze jsem z pohledu nekoho kdo Qt uz pouzil sdelil svuj dojem,
ze sloty/signaly jsou v Qt pekne udelany a libi se mi, tedy
ze Qt doporucuji oproti jinym C++ frameworkum.
Mně se zase víc líbí posluchače (Java -- Swing), kromě jiného kvůli nim není potřeba ohýbat daný jazyk. Ale ty sloty+signály mají taky něco do sebe.
Veľmi pekné, len vydrž a namiesto jedno a dvojslabičných premenných daj radšej celé názvy, vždy je zrozumiteľnejšie window ako w, teraz je to v poho ale v ďaľších dieloch by sme sa v tom mohli stratiť :)
Super! Už se těším na další díly.
Setkal jsem se s tím v GTK++ a vidím stejnou věc i tady. Z jakého důvodu se třídy oken, tlačítek a jiných prvků dědí, místo aby se paramertizovaly jejich instance?
to samé wxWidgets, jestli se nepletu
Qt 4 běží nejen na unixových operačních systémech (Linux, BSD), Windows a Mac OS X, ale i na nejrůznějších mobilních zařízeních.
Spíš by bylo vhodnější do toho nějak zakomponovat to, že Qt nevyžaduje ke svému běhu X Window System. Ale jinak moc pěkné.
No já se zaměřoval na běh v těch mobilních zařízeních. To kde to je jede je vcelku irelevantní když se jedná o OSS.
Qt::RightButton or Qt::RightButton
bude nějaká vypečená programátorská konstrukce.
#define or ||2) buttons() odpovídá logický disjunkci (prostě OR) těch 2 (při doubleClicku) tlačítek, proto je tam 2x totéž
Me houpat muzes, ale ctenari stejne odhali, ze tam ma byt
Qt::RightButton or Qt::MidButton
Oprava: Tedy ma tam byt jen ten jeden Qt::RightButton, resp. kdyz uz mermomoci chces or, tak
if(e->buttons() == (Qt::LeftButton or Qt::MidButton))
if(e->buttons() & (Qt::LeftButton | Qt::MidButton))
QMouseEvent::buttons()
.
Jak ted na to koukam, tak jsem ani nemyslel, co jsem napsal. Blamage.
Ne.
2) buttons() odpovídá logický disjunkci (prostě OR) těch 2 (při doubleClicku) tlačítek, proto je tam 2x totéžTo mi není jasný. Výraz
(Qt::RightButton or Qt::RightButton == Qt::RightButton)
nebude true
?
2) buttons() odpovídá logický disjunkci (prostě OR) těch 2 (při doubleClicku) tlačítek, proto je tam 2x totéžTak to teda nechápu. Co přesně že tam má to OR dělat?
Tohle mě docela dostalo. Celkem nedávno jsem hledal platformu pro grafické aplikace v C++ a (já vůl) si vybral zastaralé wxWidgets. Mimo to že jsou nadstavbou GTK (a tedy jsou dost pomalé), zásah do syntaxe C++ je tu ještě větší. A propos, dostal mě ten "Hello world" na snad 20 řádků? Podobná "ukázka" ve wxWidgets si délkou nezadá z helloworldem pro čisté Win API
Nechci byt hnidopich, ale nenazyval bych to "grafickym programem", ale spis "programem s grafickym uzivatelskym rozhranim". Pravda, je to dlouhe, ale presnejsi. Preji hodne stesti, ja bych si o Qt neodvazil psat, je toho dost a zase tak dobry Qtista nejsem :D Jinak nam dnes zabili Qt Extended, hodlam forkovat, kdo se prida?
Jinak nam dnes zabili Qt Extended, hodlam forkovat, kdo se prida?
Proč?:
…selected features will be migrated into the Qt framework which will result in Qt becoming an even richer, cross-platform application framework.
Jinak nam dnes zabili Qt Extended, hodlam forkovat, kdo se prida?
Podívej se http://www.abclinuxu.cz/openmoko Jsou tam odkazy na trac a GIT. Už jsem se přidal a užívám si QTE bez ozvěny :)
Pamatuje ještě dokumentaci k Turbo Pascalu? V ní se mluvilo i o "hromadě".
Pascal, hromada čeho?
Jenže překládat Big Ben by bylo jako překládat Jardík (vlastní jméno), zatímco ostatní podstatná jména se normálně překládají (mouse → myš, class → třída atd.)
Ve Win je funkce HeapAlloc a né HaldaAlloc či HromadaAlloc a proto je to heapA podle Céčka je to zase m, s touhle argumentací běž do háje.
Akorát místo "ve stacku" a "v heapu" se v češtině používá "na zásobníku" a "na haldě".Obávám se že teď někoho naštvu, ale hlasoval bych spíš za počešťování anglických názvů než za doslovné překládání. Když se člověk naučí něco z českého návodu a pak pak třebas hledá konkrétní řešení v anglických diskusích, tak aspoň hned ví co je co, i když není zrovna expert. Podle mě je to obohacení češtiny a považuji to za normální - je to o zvyku, "profesionál" nebo "informatik" taky už dnes nikomu nepřijdou divné. Těším se na další pokračování, taky doufám že z toho bude telenovela o Qt - to téma má velký potenciál a mohlo by vydržet opravdu na dlouho.
Mockrát děkuji za článek a také doufám, že z toho bude megaseriál.
Taky mockrát díky za seriál.
Jsem tzv. věčný začátečník a tohle mě určitě znovu nakopne něco se naučit.
Máte někdo praktické zkušenosti s Qt Creatorem? Konkrétně s verzí 1.0.0?
Chtěl jsem jen vědět od někoho erudovaného a kovaného v QT jak je tahle jedničková verze použitelná pro běžného C++ a QT BFU .
Líbí se mi hlavně spolupráce s integrovaným Qt designerem. Jeden čas jsem zkoušel Eclipse a Codeblocks a trápil jsem se s nastavením cest a parametrů.
Tady je vše celkem přehledné a jasné . Ale jak říkám, jsem věčný začátečník a každopádně vítám tenhle seriál a těším se na další pokračování. Nezlobil bych se kdyby
byly další díly trošku "upovídanější" a "polopatičtější pro nás pomaleji chápající .
Chtěl jsem jen vědět od někoho erudovaného a kovaného v QT jak je tahle jedničková verze použitelná pro běžného C++ a QT BFU.
Ohledně QT jsem úplný BFU, ale snad tím spíš můžu říct, že právě pro BFU je Creator použitelný velmi dobře. Hlavně není potřeba nic konfigurovat, prostě vše funguje.
Jeden čas jsem zkoušel Eclipse a Codeblocks a trápil jsem se s nastavením cest a parametrů.Jj, to byl dost děs. Pužíval jsem Code::Blocks než vytvořili QtCreator a doplňování QTříd mi nikdy nefungovalo 100%. No Qt Creator to pořešil. Taky je na něm dobrý, že se do něj dá nastavit vícero verzí Qt a u každého projektu kdykoli zvolit proti které verzi se má kompilovat.
Jen dodam, ze klicova slova signals
a slots
v hlavickovych souborech stejne jako emit
v implementaci je vhodne nahrazovat makry Q_SIGNALS
, Q_SLOTS
a Q_EMIT
. Umozni to pozdeji pouzit zdrojaky v projektech se signal/slot mechanismy tretich stran. V nejhorsim pripade budou tyto makra alespon viditelnejsi v editoru, ktery zvyraznuje syntaxi C++, ale nezna klicove slova Qt (cili vetsina).
Jo jo, takovejch projektů už jsem viděl, co v nich nemělo valnej smysl od začátku používat logckéa rozumné věci ...
QApplication app(argc, argv); MyWindow w; w.show(); // qApp je globální ukazatel na instanci QApplication // qApp->exec() je zde totéž jako app.exec() return qApp->exec();To nevypadá thread-safe. Když před řádkem
QApplication app(argc, argv);
vytvořím nový thread a v něm zavolám qApp->exec() tak se to asi může pokakat jestli se qApp nastaví až v konstruktoru QApplication.
QObject(0x0)
, takže tak. Nespadne to, ale řekne to
QApplication::exec: Please instantiate the QApplication object first
qApp->exec()
místo app.exec()
Abys nemusel tahat ukazatel na lokalni promennou fce main() po cele aplikaci jako argument vsech metod? Je to bezpecne minimalne pro cteni.
Nicmene prima zmena vlastnosti tridy QApplication z vice vlaken soucasne by mohla natropit vice skody nez uzitku, v dokumentaci totiz neni zminka "vlaknove bezpecnosti" (zdrojaky ted nemam k dispozici). Bezpecnou cestou je uziti signal/slot mechanismu mezi vlakny a napojit tak napr. QTimer s nulovym intervalem na slot QApplication (tech je ale dost malo, protoze vetsina metod je statickych )
kedy sa mozeme tesit na dalsi diel serialu ?
Tak som stravil 10 minut hladanim, ako skompilovat hello world a zistil som, zetreba pouzit qmake-qt4 namiesto qmake, v opacnom pripade nevedel najst hlavickove subory. Mozno tato informacia usetri cas podobnemu totalnemu zaciatocnikovi ako som ja :)
A pokud máte stejné distro jako já, výchozí qmake se nastavuje tímhle příkazem:
sudo update-alternatives --config qmake
connect není metoda, ale makro, ale to je jen kosmetika :)
Nechce se mi to googlit, ale prostě vím, že je to makro. Jediné čím ti to mohu podložit jsou má vysokoškolská skripta a náš doktor informatiky programuje asi 15-20 let, takže bych tam chybu neviděl
Není třeba to googlit nebo hledat, je to jen slovíčkaření- jedná se o vnitřní implementaci. Voni do dokumentace to asi píšou pro pochopení ne pro super přesnost, či jak to vnitřně implmentují... Je to třeba jako ve WindowsAPI MessageBox to je taky makro, které se rozvine do MessageBoxA (ANSI verze), MessageBoxW (Unicode verze). Ahoj
static bool connect(const QObject *sender, const char *signal, const QObject *receiver, const char *member ...Časť hlavičkového súboru qobject.h, connect je skutočne metóda, makrá sú SIGNAL a SLOT.
tak mi to nedalo a prolezl jsem celou tu kapitolu ve skriptech a je tam na dvou místech: makro i metoda, takže se zdá se vloudila malá chybička a já vás tu tedy prudím... ale to neva, alespoň to pomohl k objevu chyby :o)
mybutton.h
, mybutton.cpp
a main.cc
jsem vložil obsah z článku, spustil jsem
qmake -project qmake makea přeložilo se to bez problémů.