Společnost Amazon miliardáře Jeffa Bezose vypustila na oběžnou dráhu první várku družic svého projektu Kuiper, který má z vesmíru poskytovat vysokorychlostní internetové připojení po celém světě a snažit se konkurovat nyní dominantnímu Starlinku nejbohatšího muže planety Elona Muska.
Poslední aktualizací začal model GPT-4o uživatelům příliš podlézat. OpenAI jej tak vrátila k předchozí verzi.
Google Chrome 136 byl prohlášen za stabilní. Nejnovější stabilní verze 136.0.7103.59 přináší řadu novinek z hlediska uživatelů i vývojářů. Podrobný přehled v poznámkách k vydání. Opraveno bylo 8 bezpečnostních chyb. Vylepšeny byly také nástroje pro vývojáře.
Homebrew (Wikipedie), správce balíčků pro macOS a od verze 2.0.0 také pro Linux, byl vydán ve verzi 4.5.0. Na stránce Homebrew Formulae lze procházet seznamem balíčků. K dispozici jsou také různé statistiky.
Byl vydán Mozilla Firefox 138.0. Přehled novinek v poznámkách k vydání a poznámkách k vydání pro vývojáře. Řešeny jsou rovněž bezpečnostní chyby. Nový Firefox 138 je již k dispozici také na Flathubu a Snapcraftu.
Šestnáctý ročník ne-konference jOpenSpace se koná 3. – 5. října 2025 v Hotelu Antoň v Telči. Pro účast je potřeba vyplnit registrační formulář. Ne-konference neznamená, že se organizátorům nechce připravovat program, ale naopak dává prostor všem pozvaným, aby si program sami složili z toho nejzajímavějšího, čím se v poslední době zabývají nebo co je oslovilo. Obsah, který vytvářejí všichni účastníci, se skládá z desetiminutových
… více »Richard Stallman přednáší ve středu 7. května od 16:30 na Technické univerzitě v Liberci o vlivu technologií na svobodu. Přednáška je určená jak odborné tak laické veřejnosti.
Jean-Baptiste Mardelle se v příspěvku na blogu rozepsal o novinkám v nejnovější verzi 25.04.0 editoru videa Kdenlive (Wikipedie). Ke stažení také na Flathubu.
TmuxAI (GitHub) je AI asistent pro práci v terminálu. Vyžaduje účet na OpenRouter.
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ů.