abclinuxu.cz AbcLinuxu.cz itbiz.cz ITBiz.cz HDmag.cz HDmag.cz abcprace.cz AbcPráce.cz
Inzerujte na AbcPráce.cz od 950 Kč
Rozšířené hledání
×
    31.5. 23:55 | Nová verze

    Byla vydána nová stabilní verze 24.05 linuxové distribuce NixOS (Wikipedie). Její kódové označení je Uakari. Podrobný přehled novinek v poznámkách k vydání. O balíčky se v NixOS stará správce balíčků Nix.

    Ladislav Hagara | Komentářů: 0
    31.5. 17:33 | Nová verze

    Byla vydána nová verze 1.48.0 sady nástrojů pro správu síťových připojení NetworkManager. Novinkám se v příspěvku na blogu NetworkManageru věnuje Fernando F. Mancera. Mimo jiné se v nastavení místo mac-address-blacklist nově používá mac-address-denylist.

    Ladislav Hagara | Komentářů: 11
    31.5. 17:11 | Komunita

    Před 25 lety, 31. května 1999, započal vývoj grafického editoru Krita (Wikipedie). Tenkrát ještě pod názvem KImageShop a později pod názvem Krayon.

    Ladislav Hagara | Komentářů: 3
    31.5. 12:55 | Nová verze

    Farid Abdelnour se v příspěvku na blogu rozepsal o novinkám v nejnovější verzi 24.05.0 editoru videa Kdenlive (Wikipedie). Ke stažení brzy také na Flathubu.

    Ladislav Hagara | Komentářů: 0
    31.5. 11:22 | Zajímavý článek

    David Revoy, autor mj. komiksu Pepper&Carrot, se rozepsal o své aktuální grafické pracovní stanici: Debian 12 Bookworm, okenní systém X11, KDE Plasma 5.27, …

    Ladislav Hagara | Komentářů: 9
    30.5. 22:44 | Nová verze

    Wayland (Wikipedie) byl vydán ve verzi 1.23.0. Z novinek lze vypíchnout podporu OpenBSD.

    Ladislav Hagara | Komentářů: 0
    30.5. 21:22 | Zajímavý článek

    Craig Loewen na blogu Microsoftu představil novinky ve Windows Subsystému pro Linux (WSL). Vypíchnout lze GUI aplikaci pro nastavování WSL nebo správu WSL z Dev Home.

    Ladislav Hagara | Komentářů: 0
    30.5. 12:44 | Pozvánky

    V sobotu 1. června lze navštívit Maker Faire Ostrava, festival plný workshopů, interaktivních činností a především nadšených a zvídavých lidí.

    Ladislav Hagara | Komentářů: 0
    30.5. 12:22 | Nová verze

    Webový server Caddy (Wikipedie) s celou řadou zajímavých vlastností byl vydán ve verzi 2.8 (𝕏). Přehled novinek na GitHubu.

    Ladislav Hagara | Komentářů: 16
    29.5. 22:11 | Nová verze

    Byla vydána verze 3.0 (@, 𝕏) svobodného softwaru HAProxy (The Reliable, High Performance TCP/HTTP Load Balancer; Wikipedie) řešícího vysokou dostupnost, vyvažování zátěže a reverzní proxy. Detailní přehled novinek v příspěvku na blogu společnosti HAProxy Technologies.

    Ladislav Hagara | Komentářů: 7
    Rozcestník

    Grafické programy v Qt 4 - 2 (hlavní okno programu)

    12. 3. 2009 | David Watzke | Programování | 22819×

    V tomto díle si ukážeme, jak vytvořit hlavní okno, jak uložit a načíst nastavení a nakonec, jak by mohl vypadat program pro jednoduché malování.

    Hlavní okno

    Spousta programů má ve svém hlavním okně nabídku (menubar), panely nástrojů (toolbary), stavový řádek (status bar) a podobně. Qt pro tyto účely obsahuje třídu QMainWindow, která vytvoření hlavního okna usnadňuje. Následuje jednoduchý demonstrační program – je to pouze widget, takže je třeba vytvořit ještě main.cpp, viz předchozí díl.

    mainwindow.h: Zde bych zmínil tzv. dopřednou deklaraci (forward declaration), která může zkrátit dobu potřebnou k sestavení programu. Použité třídy, jejichž API v hlavičkovém souboru nepotřebujeme (třeba členské proměnné), takto dopředu deklarujeme a #include dáme až do implementačního .cpp souboru. Kompilátor díky tomu nebude zbytečně víckrát parsovat hromadu hlavičkových souborů, jen aby se dozvěděl, že taková třída opravdu existuje (protože to je jediná informace, kterou v tomto bodě potřebuje). Přímo vývojáři Qt tvrdí, že to v některých případech může mít poměrně velký vliv na dobu kompilace.

    #ifndef MAINWINDOW_H
    #define MAINWINDOW_H
    
    #include <QMainWindow>
    
    // dopředná deklarace
    class QDir;
    class QMessageBox;
    class QListWidget;
    class QListWidgetItem;
    
    class MainWindow : public QMainWindow
    {
    	Q_OBJECT
    
    public:
    	// v konstruktoru nepředáváme rodiče, protože jde o hlavní okno
    	MainWindow();
    
    private:
    	QDir* m_dir;
    	QListWidget* m_list;
    	QString m_dName;
    
    private slots:
    	void openDir(QString = QString());
    	void itemDoubleClicked(QListWidgetItem*);
    };
    
    #endif
    

    mainwindow.cpp: Všimněte si slotu itemDoubleClicked, kterému je předán ukazatel na uživatelem dvojkliknutou položku seznamu QListWidgetItem.

    #include "mainwindow.h"
    #include <QApplication>
    #include <QMenuBar>
    #include <QToolBar>
    #include <QAction>
    #include <QFileDialog>
    #include <QDir>
    #include <QFileInfo>
    #include <QMessageBox>
    #include <QListWidget>
    
    MainWindow::MainWindow() : m_dir(0)
    {
    	// vytvoříme panel s nabídkou
    	QMenuBar* menuBar = new QMenuBar(this);
    	// jednotlivá menu
    	QMenu* menuFile = new QMenu(tr("&File"));
    	QMenu* menuHelp = new QMenu(tr("&Help"));
    	// položky menu
    	QAction* actionOpen = new QAction(tr("&Open"), this);
    	QAction* actionQuit = new QAction(tr("&Quit"), this);
    	QAction* actionAboutQt = new QAction(tr("About Qt"), this);
    
    	// nastavení klávesové zkratky
    	actionOpen->setShortcut(QKeySequence("Ctrl+O"));
    
    	// propojení položek menu s funkcemi programu
    	connect(actionOpen, SIGNAL(triggered()), this, SLOT(openDir()));
    	connect(actionQuit, SIGNAL(triggered()), qApp, SLOT(quit()));
    	connect(actionAboutQt, SIGNAL(triggered()), qApp, SLOT(aboutQt()));
    
    	// přidáme položky do patřičných nabídek...
    	menuFile->addAction(actionOpen);
    	menuFile->addAction(actionQuit);
    	menuHelp->addAction(actionAboutQt);
    	//... a jednotlivá menu do panelu
    	menuBar->addMenu(menuFile);
    	menuBar->addMenu(menuHelp);
    
    	// řekneme widgetu, aby použil naše menu
    	setMenuBar(menuBar);
    
    	// vytvoříme grafický seznam položek
    	m_list = new QListWidget(this);
    	// a nastavíme jej jako hlavní widget hlavního okna
    	setCentralWidget(m_list);
    
    	// dvojklik na seznam spustí náš slot
    	connect(m_list, SIGNAL(itemDoubleClicked(QListWidgetItem*)),
    		this, SLOT(itemDoubleClicked(QListWidgetItem*)));
    
    	resize(600, 400);
    }
    
    void MainWindow::itemDoubleClicked(QListWidgetItem* item)
    {
    	// tato třída poskytuje informace o souborech a adresářích
    	QFileInfo fileInfo(m_dName + "/" + item->text());
    
    	if(fileInfo.isDir())
    		openDir(fileInfo.canonicalFilePath());
    	else
    	{
    		// dialogy dovedou pracovat s jednoduchým HTML
    		QString infotext = "<b>Name</b>: " + fileInfo.fileName()
    			 + "<br/><b>Location</b>: " + fileInfo.canonicalPath()
    			 + "<br/><b>Owner</b>: " + fileInfo.owner()
    			 + "<br/><b>Group</b>: " + fileInfo.group();
    		QMessageBox::information(this, tr("File info"), infotext);
    	}
    }
    
    void MainWindow::openDir(QString dName)
    {
    	if(!dName.isEmpty())
    		m_dName = dName;
    	else
    		do	// dialog pro výběr existujícího adresáře
    			m_dName = QFileDialog::getExistingDirectory(this, tr("Choose a directory"));
    		while(m_dName.isEmpty());
    
    	m_dir = new QDir(m_dName);
    	// Zde by bylo vhodné kontrolovat přístupová práva,
    	// a patřičně na ně reagovat. Takto program nedostatečné
    	// oprávnění ignoruje a seznam se vyprázdní.
    
    	// vyprázdníme seznam
    	m_list->clear();
    	// přidáme položky z adresáře do seznamu
    	m_list->addItems(m_dir->entryList(QDir::AllEntries, QDir::Name));
    
    	delete m_dir;
    }
    

    qt 2 example1

    Ukládání a načítání nastavení

    Velmi často se hodí možnost ukládat (a poté zpětně načítat) nastavení programu, a proto si ukážeme, jak to je jednoduché s třídou QSettings. Konfigurace se ukládá do souboru ~/.config/organizace/název_programu.conf. Pokud budete chtít ukládat veškerou konfiguraci programu do jednoho souboru (což je běžné), pak je vhodné nastavit si název organizace a programu již do instance QApplication ve funkci main(), abyste tyto údaje nemuseli zadávat pokaždé do konstruktoru QSettings:

    qApp->setOrganizationName("Organizace");
    qApp->setApplicationName("SuperProgram");
    // konfigurace bude v ~/.config/Organizace/SuperProgram.conf
    

    Asi nejdůležitější 2 metody třídy QSettings jsou:

    • void setValue(const QString& key, const QVariant& value) - nastaví položce key hodnotu value.
    • QVariant value(const QString& key, const QVariant& defaultValue = QVariant()) - vrátí hodnotu položky key. Pro případ, že tato položka není v nastavení, můžete nastavit volitelnou výchozí hodnotu.

    Co je to QVariant? Jde o jakýsi kontejner, který dovede pojmout libovolný datový typ. Chová se jako union pro základní datové typy C++ a Qt. Když chcete z proměnné tohoto typu dostat hodnotu, musíte vědět, jakého je hodnota typu (k tomu může v nejhorším pomoci metoda typeName(), která vrátí název typu jako C řetězec) a zavolat patřičnou metodu toType(), kde Type nahradíte za patřičný datový typ:

    QVariant test(true);
    bool b = test.toBool();
    
    QVariant numero(123);
    int n = numero.toInt();
    

    A zde konečně přichází ukázkový program. Zkuste si napsat něco do textového pole a potom na spinboxu vybrat nějaké číslo. Nastavení uložte tlačítkem Save, program ukončete a tlačítko Load by vaše nastavení mělo načíst.

    settings.h:

    #ifndef SETTINGS_H
    #define SETTINGS_H
    
    #include <QWidget>
    #include <QSettings>
    
    class QLineEdit;
    class QSpinBox;
    
    class Settings : public QWidget
    {
    	Q_OBJECT
    
    public:
    	Settings();
    
    private:
    	QSettings m_settings;
    	QLineEdit* m_lineEdit;
    	QSpinBox* m_spinBox;
    
    public slots:
    	void loadSettings();
    	void saveSettings();
    };
    
    #endif // SETTINGS_H
    

    settings.cpp:

    #include "settings.h"
    
    #include <QVBoxLayout>
    #include <QHBoxLayout>
    #include <QLineEdit>
    #include <QSpinBox>
    #include <QPushButton>
    
    Settings::Settings()
    {
    	m_lineEdit = new QLineEdit();
    	m_spinBox = new QSpinBox();
    
    	//tlačítka pro načtení a uložení nastavení
    	QPushButton* load = new QPushButton(tr("Load"));
    	QPushButton* save = new QPushButton(tr("Save"));
    
    	connect(load, SIGNAL(clicked()), this, SLOT(loadSettings()));
    	connect(save, SIGNAL(clicked()), this, SLOT(saveSettings()));
    
    	QHBoxLayout* wLayout = new QHBoxLayout();
    	wLayout->addWidget(m_lineEdit, 1);
    	wLayout->addWidget(m_spinBox);
    
    	QHBoxLayout* btnLayout = new QHBoxLayout();
    	btnLayout->addWidget(load);
    	btnLayout->addWidget(save);
    
    	QVBoxLayout* layout = new QVBoxLayout(this);
    	layout->addLayout(wLayout);
    	layout->addLayout(btnLayout);
    
    	setLayout(layout);
    }
    
    // načte nastavení - hodnoty načtené z konfiguračního souboru přiřadí patřičným objektům
    void Settings::loadSettings()
    {
    	m_lineEdit->setText( m_settings.value("lineEdit", QString()).toString() );
    	m_spinBox->setValue( m_settings.value("spinBox", 0).toInt() );
    }
    
    // uloží nastavení
    void Settings::saveSettings()
    {
    	m_settings.setValue("lineEdit", m_lineEdit->text());
    	m_settings.setValue("spinBox", m_spinBox->value());
    }
    

    qt 2 example2

    Události a kreslení

    Na události jsme už jednou narazili v minulém díle, když jsme reimplementovali událost dvojkliku na speciální tlačítko. Tentokrát si ovšem kromě událostí myši zkusíme napsat i paintEvent(), což je funkce, která má za úkol vykreslit a následně překreslovat widget. Překreslit můžeme také pouze danou oblast, takže toho pro efektivitu využijeme a ukážeme si, jak napsat velice jednoduché Malování :-)

    painting.h:

    #ifndef PAINTING_H
    #define PAINTING_H
    
    #include <QWidget>
    #include <QPainter>
    
    class Painting : public QWidget
    {
    public:
    	Painting(QWidget *parent = 0);
    
    protected:
    	// hýbání myší
    	virtual void mouseMoveEvent(QMouseEvent*);
    	// stlačení tlačítka myši
    	virtual void mousePressEvent(QMouseEvent*);
    	// puštění tlačítka myši
    	virtual void mouseReleaseEvent(QMouseEvent*);
    	// událost kreslení
    	virtual void paintEvent(QPaintEvent* e);
    
    private:
    	bool m_painting;
    };
    
    #endif // PAINTING_H
    

    painting.cpp:

    #include "painting.h"
    
    #include <QMouseEvent>
    
    Painting::Painting(QWidget *parent)
    	: QWidget(parent), m_painting(false)
    {
    	// bílé pozadí
    	setPalette(QPalette(QColor(255, 255, 255)));
    	setAutoFillBackground(true);
    }
    
    // povolí kreslení
    void Painting::mousePressEvent(QMouseEvent* e)
    {
    	m_painting = true;
    	e->ignore();
    }
    
    // zakáže kreslení
    void Painting::mouseReleaseEvent(QMouseEvent* e)
    {
    	m_painting = false;
    	e->ignore();
    }
    
    // pokud je povolené kreslení, aktualizuje pixel pod kurzorem
    void Painting::mouseMoveEvent(QMouseEvent* e)
    {
    	if(!m_painting)
    		return;
    	update(e->x(), e->y(), 1, 1);
    }
    
    // vykreslíme pixel, který máme aktualizovat
    void Painting::paintEvent(QPaintEvent* e)
    {
    	QPainter p(this);
    	// nastaví barvu "pera"
    	p.setPen(Qt::black);
    	// vykreslí tečku na daném bodě
    	p.drawPoint(e->rect().x(), e->rect().y());
    }
    

    qt 2 example3

    QPainter toho dokáže mnohem víc, než jen kreslit tečky, ale podrobněji to v tomto seriálu nebudeme rozebírat, takže zájemce odkazuji na dokumentaci.

    Závěr

    V příštím díle si mj. ukážeme, jak navrhnout GUI pomocí Qt Designeru a jak s takovým návrhem potom dále pracovat.

    Nejčtenější články posledního měsíce

    Týden na ScienceMag.cz: Působivá simulace pádu do černé díry
    Týden na ITBiz: Kvalita a přesnost dat generovaných AI rozhodne o důvěře zaměstnanců v umělou inteligenci
    Květnový výprodej na Goodoffer24 nabízí Windows 11 Pro za €20 a mnoho dalších slev

    Nejkomentovanější články posledního měsíce

    Týden na ScienceMag.cz: Kosmologové se opět zkouší vypořádat se s problémem Hubbleovy konstanty
    Týden na ITBiz: Platby výkupného za ransomware vzrostly za poslední rok na pětinásobek
    Jaderné noviny – přehled za duben 2024
      všechny statistiky »

    Seriál Qt 4 - psaní grafických programů (dílů: 12)

    Grafické programy v Qt 4 - 1 (úvod, hello world) (první díl)
    <—« Grafické programy v Qt 4 - 1 (úvod, hello world)
    »—> Grafické programy v Qt 4 - 3 (Qt Creator a Designer)
    Grafické programy v Qt 4 – 12 (stylování GUI pomocí CSS) (poslední díl)

    Související články

    Cmake: zjednoduš si život
    Seriál: Kommander
    Seriál: KDE: tipy a triky
    Seriál: Začíname KProgramovať
    Co přináší KDE 4 - (alfaverze, porty a D-BUS)
    Co přináší KDE 4 - (technologie)
    Novinky v KDE 4
    Jaké je KDE 4.0.0
    Seriál: KDE 4.1 - megarecenze

    Odkazy a zdroje

    doc.trolltech.com

    Další články z této rubriky

    LLVM a Clang – více než dobrá náhrada za GCC
    Ze 4 s na 0,9 s – programovací jazyk Vala v praxi
    Reverzujeme ovladače pro USB HID zařízení
    Linux: systémové volání splice()
    Programování v jazyce Vala - základní prvky jazyka
           

    Hodnocení: 95 %

            špatnédobré        

    Nástroje: Tisk bez diskuse

    Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

    Komentáře

    Vložit další komentář

    kozzi avatar 12.3.2009 03:14 kozzi | skóre: 55 | blog: vse_o_vsem | Pacman (Bratrušov)
    Rozbalit Rozbalit vše Re: Grafické programy v Qt 4 - 2 (hlavní okno programu)
    Bohužel musím být trochu kritický. Tento seriál trpí jedním hlavním nedostatkem. Nějak my chybí skupina lidí, pro které by mohl být zajímavý. Určitě není určen pro lidi co s Qt začínají. Takže pokud vynecháme tuto skupinu, tak nám zbývají lidé co Qt částečně znají. No je sice pravda, že pro tyto lidi by mohl mít v určitých částch malý význam, ale dle mě, né dostatečně významný. Pro mě osobně se jedná o text, který mi nic moc nového neřekne, ale je pravda že něco mále mě určitě přiučí. Další věc co by nebyla na škodu je, kdyby celý článek postupně směřoval k určitému cíli. Prostě kdyby na konci článku bylo výsledkem třeba něco jako totalcmd například :-). Jinak mám celkově dojem že pokud bych prostudoval kód Doliho programů, tak se dozvím to samé ;-). Celkově mi jde o to, že by bylo možná lepší, se zaměřit na lidi co chtějí Qt začít.
    Linux je jako mušketýři "jeden za všechny, všichni za jednoho"
    David Watzke avatar 12.3.2009 03:22 David Watzke | skóre: 74 | blog: Blog... | Praha
    Rozbalit Rozbalit vše Re: Grafické programy v Qt 4 - 2 (hlavní okno programu)
    Je určený pro lidi, co s Qt začínají, ale ne pro ty, co začínají s C++. Kritiku beru, zkusím bejt do budoucna trochu víc upovídanej, jestli se ukáže, že to je žádoucí.
    “Being honest may not get you a lot of friends but it’ll always get you the right ones” ―John Lennon
    Jardík avatar 12.3.2009 08:38 Jardík | skóre: 40 | blog: jarda_bloguje
    Rozbalit Rozbalit vše Re: Grafické programy v Qt 4 - 2 (hlavní okno programu)
    Není. Mně např. k pochopení věci stačí jednou, maximálně dvakrát, přečíst zdroják, takže od příště stačí pouze ten :-)
    Věřím v jednoho Boha.
    kozzi avatar 12.3.2009 18:35 kozzi | skóre: 55 | blog: vse_o_vsem | Pacman (Bratrušov)
    Rozbalit Rozbalit vše Re: Grafické programy v Qt 4 - 2 (hlavní okno programu)
    LOL, právě si tak čtu tento seriál a najednou koukám na komentáře, a tam jeden ode mě. A to sem si říkal že sem to včera v té hospodě (hospodách) nepřehnal a vše si pamatuju :-D. No by mě zajímalo jestli sem v tu dobu tomu kodu rozuměl :-)
    Linux je jako mušketýři "jeden za všechny, všichni za jednoho"
    kozzi avatar 12.3.2009 18:36 kozzi | skóre: 55 | blog: vse_o_vsem | Pacman (Bratrušov)
    Rozbalit Rozbalit vše Re: Grafické programy v Qt 4 - 2 (hlavní okno programu)
    Zajímavé je že tam není ani moc pravopisných chyb a je to s háčkama. To bude nějakej Matrix :-D
    Linux je jako mušketýři "jeden za všechny, všichni za jednoho"
    12.3.2009 11:23 T.O.M. | skóre: 22 | blog: T.O.M.'s blog | Ostrava
    Rozbalit Rozbalit vše Re: Grafické programy v Qt 4 - 2 (hlavní okno programu)

    Musím souhlasit, že seriál není cílen pro úplné začátečníky a cílová skupina tak bude chudší než asi bylo zamýšleno. Ovšem pokud si je čtenář jistý svými C++ znalostmi, měl by se poměrně rychle problematikou prokousat.

    Jediné, co by bylo pro úplné začátečníky přínosnější, by byla lokalizace celé Qt dokumentace do češtiny. K tomu ale není důvod, protože pokud není člověk schopný zvládnout (alespoň pasivně) technický anglický text tak, aby pochopil myšlenku (není potřeba překládat každé slovo a chápat gramatiku), nikdy z něj nebude programátor. Alespoň ne takový, který svede více než jen nahradu "Hello world!" za "Ahoj svete" (I když taky jsem měl radost jak decko, když se mi před mnoha lety podařilo poprvé přeložil změny v jednom demu podobného rozsahu :-D )

    13.3.2009 15:40 trekker.dk | skóre: 72
    Rozbalit Rozbalit vše Re: Grafické programy v Qt 4 - 2 (hlavní okno programu)
    Musím souhlasit, že seriál není cílen pro úplné začátečníky a cílová skupina tak bude chudší než asi bylo zamýšleno.
    Nesouhlas
    Ovšem pokud si je čtenář jistý svými C++ znalostmi, měl by se poměrně rychle problematikou prokousat.
    Jak je řečeno jinde, článek je pro začátečníky v Qt, ne v C++
    Quando omni flunkus moritati
    Marián Kyral avatar 12.3.2009 12:37 Marián Kyral | skóre: 29 | blog: Sem_Tam | Frýdek-Místek
    Rozbalit Rozbalit vše Re: Grafické programy v Qt 4 - 2 (hlavní okno programu)

    Já tenhle seriál vítám, alespoň se konečně dozvím, proč to je právě takhle :-)

     

    Jsem programátor v C, shell, PL/SQL. C++ jsem se ještě stále nenaučil, mám jen jakési povědomí o objektech a jak to zhruba funguje, ale to mi nezabránilo spáchat jeden plugin do kate (Konečně jsem jej začal přepisovat pro KDE 4) a podílet se na vývoji jednoho plasmoidu (yaWP - jestli ho někdo zná). Něco si najdu v tutoriálech, něco najdu v jiných programech a inspiruji se, zbytek metodou pokus-omyl. Nejhorší to bývá při překladu. Některé hlášky jsou docela zajímavé a co je vlastně špatně člověk většinou zjistí až s pomocí Googlu.

     

     

    Saljack avatar 12.3.2009 14:52 Saljack | skóre: 28 | blog: Saljack | Praha
    Rozbalit Rozbalit vše Re: Grafické programy v Qt 4 - 2 (hlavní okno programu)
    Tohle je přesně seriál pro mě. Dříve jsem dělal s PyQt, ale chci se naučit dělat s C++ a Qt. Do teď jsem se hodně inspiroval z Doliho faratu a můžu jen doporučit najít si nějaký projekt a číst si zdrojáky a snažit se pochopit proč je to právě tak. A díky za QSettings vůbec sem o této třídě nevěděl a je to přesně to co jsem potřeboval ;-).
    Sex, Drugs & Rock´n Roll.
    David Watzke avatar 12.3.2009 15:01 David Watzke | skóre: 74 | blog: Blog... | Praha
    Rozbalit Rozbalit vše Re: Grafické programy v Qt 4 - 2 (hlavní okno programu)
    I já se tímhle seriálem tu a tam něco přiučím :-) Bez QSettings by byl svět Qt aplikací docela smutnej :-) Není zač.
    “Being honest may not get you a lot of friends but it’ll always get you the right ones” ―John Lennon
    frEon avatar 12.3.2009 16:09 frEon | skóre: 40 | Praha
    Rozbalit Rozbalit vše Re: Grafické programy v Qt 4 - 2 (hlavní okno programu)
    Ja treba s qt neumim, c++ tak trochu (stravil jsem ale dost casu s c) a jenom pasivne, ale prikladum rozumim (az na tu vec s dvojteckou v MainWindow::MainWindow() : m_dir(0)). Podle me jsou dost dobre voleny na to, aby z nich bylo pekne jasne k cemu jednotlive Qt objekty slouzi a jak se s nimi delaji zakladni veci. Podle me je to pekny start pro programatory do Qt.
    Talking about music is like dancing to architecture.
    David Watzke avatar 12.3.2009 16:18 David Watzke | skóre: 74 | blog: Blog... | Praha
    Rozbalit Rozbalit vše Re: Grafické programy v Qt 4 - 2 (hlavní okno programu)
    "Věc s dvojtečkou" lze použít jen u konstruktoru a slouží k nastavení výchozí hodnoty. Je to vlastně totéž, jako kdybych udělal tohle:
    MainWindow::MainWindow()
    {
    	m_dir = 0;
    	...
    m_dir jsem inicializoval, abych pak nemusel podmiňovat delete a mohl ho prostě spustit ať už se m_dir použije nebo ne. Je to bezpečnější.
    “Being honest may not get you a lot of friends but it’ll always get you the right ones” ―John Lennon
    12.3.2009 16:27 Ladicek | skóre: 28 | blog: variace | Havlíčkův brod
    Rozbalit Rozbalit vše Re: Grafické programy v Qt 4 - 2 (hlavní okno programu)
    Tuhle syntaxi nesnáším, ale nešť, zajímalo by mne spíš, proč ukazatel inicializuješ nulou a ne NULLou :-)
    Ještě na tom nejsem tak špatně, abych četl Viewegha.
    David Watzke avatar 12.3.2009 16:34 David Watzke | skóre: 74 | blog: Blog... | Praha
    Rozbalit Rozbalit vše Re: Grafické programy v Qt 4 - 2 (hlavní okno programu)
    Protože je to fuk.
    “Being honest may not get you a lot of friends but it’ll always get you the right ones” ―John Lennon
    Saljack avatar 12.3.2009 17:05 Saljack | skóre: 28 | blog: Saljack | Praha
    Rozbalit Rozbalit vše Re: Grafické programy v Qt 4 - 2 (hlavní okno programu)
    NULL se používalo v C v C++ by se měla používat 0.
    Sex, Drugs & Rock´n Roll.
    Jardík avatar 12.3.2009 21:07 Jardík | skóre: 40 | blog: jarda_bloguje
    Rozbalit Rozbalit vše Re: Grafické programy v Qt 4 - 2 (hlavní okno programu)
    V C++0x máme "null" (teda gcc to zrovna nějak nebere, ale ...).
    Věřím v jednoho Boha.
    12.3.2009 21:59 Ladicek | skóre: 28 | blog: variace | Havlíčkův brod
    Rozbalit Rozbalit vše Re: Grafické programy v Qt 4 - 2 (hlavní okno programu)
    Teď na to koukám: http://en.wikipedia.org/wiki/C++0x#Null_pointer_constant a mám k tomu jenom jedno: šmarjá, to je tak typicky céčkařské! Nedávno jsem četl povzdech jednoho z návrhářů Ady, že dnešní jazyky jsou vyloženě odbyté a halabala navržené, a už vím, proč to tak je. Oni si všichni berou příklad z Céčka!
    Ještě na tom nejsem tak špatně, abych četl Viewegha.
    Jardík avatar 13.3.2009 00:07 Jardík | skóre: 40 | blog: jarda_bloguje
    Rozbalit Rozbalit vše Re: Grafické programy v Qt 4 - 2 (hlavní okno programu)
    No vidíte .. stejně jsem debil, napsal jsem null (asi zblblej z C#) místo nullptr.
    Věřím v jednoho Boha.
    14.3.2009 17:29 Ash | skóre: 53
    Rozbalit Rozbalit vše Re: Grafické programy v Qt 4 - 2 (hlavní okno programu)
    Tahle syntaxe se někomu nelíbí, ale nemí samoúčelná, umožňuje volat konstruktory předků s parametry. Jinak by byly při vytváření instance potomka automaticky volány neparametrické konstruktory předků dřív než by byla šanci v konstruktoru potomka zavolat konstruktory předka "ručně". Samozřejmě je diskutabilní nakolik je účelné takto inicializovat kdeco :)
    14.3.2009 17:45 Ladicek | skóre: 28 | blog: variace | Havlíčkův brod
    Rozbalit Rozbalit vše Re: Grafické programy v Qt 4 - 2 (hlavní okno programu)
    Wo to fo? Kde se bere ta magie, která volá neparametrický konstruktor předka dřív, než je v konstruktoru potomka šance zavolat vybraný konstruktor předka ručně? Hádám, že se jen někomu nelíbilo vynutit si volání konstruktoru předka jako úplně první příkaz v konstruktoru potomka, a tak vymyslel tenhle nekoncepční hack. Pravda? :-)
    Ještě na tom nejsem tak špatně, abych četl Viewegha.
    Saljack avatar 12.3.2009 17:11 Saljack | skóre: 28 | blog: Saljack | Praha
    Rozbalit Rozbalit vše Re: Grafické programy v Qt 4 - 2 (hlavní okno programu)
    Ovšem kdyby m_dir byla konstanta tak by to takhle nešlo a muselo by se použít to s dvojtečkou.
    Sex, Drugs & Rock´n Roll.
    frEon avatar 12.3.2009 17:44 frEon | skóre: 40 | Praha
    Rozbalit Rozbalit vše Re: Grafické programy v Qt 4 - 2 (hlavní okno programu)
    Aha, dik za vysvetleni.
    Talking about music is like dancing to architecture.
    12.3.2009 13:04 Roman Schulz | skóre: 8 | Brno
    Rozbalit Rozbalit vše Re: Grafické programy v Qt 4 - 2 (hlavní okno programu)
    Přimlouval bych se za zvětšení boxů se zdrojáky ať v nich není potřeba tolik scrollovat, teď mi to přijde celkem nepřehledné...
    David Watzke avatar 12.3.2009 13:09 David Watzke | skóre: 74 | blog: Blog... | Praha
    Rozbalit Rozbalit vše Re: Grafické programy v Qt 4 - 2 (hlavní okno programu)
    Proto je u každýho boxu tlačítko Rozbalit :-) Ale taky bych řekl, že minimálně u tohoto seriálu by bylo dobrý to trochu (nebo klidně hodně) roztáhnout už v defaultu.
    “Being honest may not get you a lot of friends but it’ll always get you the right ones” ―John Lennon
    12.3.2009 14:42 Jardik
    Rozbalit Rozbalit vše Re: Grafické programy v Qt 4 - 2 (hlavní okno programu)

    Jeste ze ne implicitne.

    13.3.2009 10:53 RapMan | skóre: 14 | blog: RapMan
    Rozbalit Rozbalit vše Re: Grafické programy v Qt 4 - 2 (hlavní okno programu)
    Ja bych chtel nejaky serial o programovani, kde bych mel plnohodnotne IDE s moznosti doplnovani syntaxe, navrhu formularu, atd. Proste pro lidi, kteri jsou zmlsani visual studiem a chteli by vedet, jak neceho podobneho dosahnout lehce pod linuxem.
    David Watzke avatar 13.3.2009 10:58 David Watzke | skóre: 74 | blog: Blog... | Praha
    Rozbalit Rozbalit vše Re: Grafické programy v Qt 4 - 2 (hlavní okno programu)
    V takovym případě by se ti mohl líbit příští díl.
    “Being honest may not get you a lot of friends but it’ll always get you the right ones” ―John Lennon
    13.3.2009 12:12 T.O.M. | skóre: 22 | blog: T.O.M.'s blog | Ostrava
    Rozbalit Rozbalit vše Re: Grafické programy v Qt 4 - 2 (hlavní okno programu)

    Vetsina takovych IDE se da ovladat pouze intuici, neni treba nic studovat ani nic slozite nastavovat (mozna par cest). A ze jich neni malo, Qt Creator, KDevelop, QDevelop, Monkey Studio, HaiQ, Vim a urcite jsem jich dost zapomel. Zakladni schopnosti jako doplnovani kodu, editaci *.ui, kompilaci, debugovani, atd. podporuji svym zpusobem vsechny. Dobre IDE neznamena, ze se musi chovat a vypadat jako MSVS. Je treba vyzkouset vsechny a jit cestou nejmensiho odporu. Napr. u me je urcite neschudny vi, prestoze si jini bez nej nedokazi pocitac ani predstavit...

    David Watzke avatar 13.3.2009 12:21 David Watzke | skóre: 74 | blog: Blog... | Praha
    Rozbalit Rozbalit vše Re: Grafické programy v Qt 4 - 2 (hlavní okno programu)
    Vim ovládáš intuicí? :-D To já jsem se to teda nejdřív musel naučit, celkem závidím ;-)
    “Being honest may not get you a lot of friends but it’ll always get you the right ones” ―John Lennon
    Marián Kyral avatar 13.3.2009 13:46 Marián Kyral | skóre: 29 | blog: Sem_Tam | Frýdek-Místek
    Rozbalit Rozbalit vše Re: Grafické programy v Qt 4 - 2 (hlavní okno programu)

    Když pochopíš princip, tak je i vim intuitivní.

    dw - delete word

    Nicméně netvrdím, že bych vim nějak extra uměl. Většinou se totiž pohybuji na různých AIX serverech, kde je jen vi, tak jsem se naučil jen pár základních příkazů, které potřebuji.

    13.3.2009 15:00 T.O.M. | skóre: 22 | blog: T.O.M.'s blog | Ostrava
    Rozbalit Rozbalit vše Re: Grafické programy v Qt 4 - 2 (hlavní okno programu)

    Ja a Vim nejsme kamaradi :-) Ale pokud clovek ovlada Vim, verim, ze neni problem ho pouzivat i jako IDE pro Qt. (uz jsem tu par screenshotu videl)

    Marián Kyral avatar 13.3.2009 22:25 Marián Kyral | skóre: 29 | blog: Sem_Tam | Frýdek-Místek
    Rozbalit Rozbalit vše Re: Grafické programy v Qt 4 - 2 (hlavní okno programu)

    Právě jsem na jeden narazil...

    http://www.abclinuxu.cz/desktopy/mirec-20090204

    Marián Kyral avatar 13.3.2009 12:48 Marián Kyral | skóre: 29 | blog: Sem_Tam | Frýdek-Místek
    Rozbalit Rozbalit vše Re: Grafické programy v Qt 4 - 2 (hlavní okno programu)

    Možná mi někdo poradí. Tvrdě jsem narazil s naprostou trivialitou :-(

    Mám tři proměnné QColor, potřebuji je zazálohovat, změnit na default , něco vykreslit a pak obnovit ze zálohy. Bohužel to obnovení mi nějak nefunguje :-( Zkoušel jsem různé varianty, studoval dokumentaci ke QColor, ale zatím nic nezabralo. Jak už jsem psal, v C++ celkem dost plavu :-(

        if ( m_theme != "default" && m_theme != "naked" ) {
          // set default colors when custom colors and not default or naked theme
          QColor fontColorBck = m_fontColor;
          QColor fontLowerColorBck = m_fontLowerColor;
          QColor fontShadowColorBck = m_fontShadowColor;
    
          setDefaultColors();
        }
    
    .....
    
        if ( m_theme != "default" && m_theme != "naked" ) {
          // restore font colors
          // tady mi to nějak drhne :-(
          m_fontColor = fontColorBck;
          m_fontLowerColor = fontLowerColorBck;
          m_fontShadowColor = fontShadowColorBck;
        }
    
    /usr/local/src/yawp/yawp/0.1/yawp.cpp: In member function ‘void YaWP::paintPanel(QPainter*, const QStyleOptionGraphicsItem*, const QRect&)’:
    /usr/local/src/yawp/yawp/0.1/yawp.cpp:781: error: ‘fontColorBck’ was not declared in this scope
    /usr/local/src/yawp/yawp/0.1/yawp.cpp:782: error: ‘fontLowerColorBck’ was not declared in this scope
    /usr/local/src/yawp/yawp/0.1/yawp.cpp:783: error: ‘fontShadowColorBck’ was not declared in this scope
    make[2]: *** [CMakeFiles/plasma_yawp.dir/yawp.o] Error 1
    make[1]: *** [CMakeFiles/plasma_yawp.dir/all] Error 2
    make: *** [all] Error 2
    
    13.3.2009 12:57 Ladicek | skóre: 28 | blog: variace | Havlíčkův brod
    Rozbalit Rozbalit vše Re: Grafické programy v Qt 4 - 2 (hlavní okno programu)
    Kupodivu ta hláška překladače není úplně blbá :-) Proměnné fontColorBck, fontLowerColorBck a fontShadowColorBck jsou platné jenom v tom bloku if ( m_theme != "default" && m_theme != "naked" ) { ... }. Nejpřímočařejší postup (netvrdím, že nejlepší) by byl asi takový:
        QColor fontColorBck;
        QColor fontLowerColorBck;
        QColor fontShadowColorBck;
    
        if ( m_theme != "default" && m_theme != "naked" ) {
          // set default colors when custom colors and not default or naked theme
          fontColorBck = m_fontColor;
          fontLowerColorBck = m_fontLowerColor;
          fontShadowColorBck = m_fontShadowColor;
    
          setDefaultColors();
        }
    
    .....
    
        if ( m_theme != "default" && m_theme != "naked" ) {
          // restore font colors
          m_fontColor = fontColorBck;
          m_fontLowerColor = fontLowerColorBck;
          m_fontShadowColor = fontShadowColorBck;
        }
    
    Nejsa Céčkař, nejsem si jistý, jestli překladač nebude prudit, že ty proměnné might not be initialized, ale to je jen takový detail :-)
    Ještě na tom nejsem tak špatně, abych četl Viewegha.
    David Watzke avatar 13.3.2009 13:02 David Watzke | skóre: 74 | blog: Blog... | Praha
    Rozbalit Rozbalit vše Re: Grafické programy v Qt 4 - 2 (hlavní okno programu)
    No jo vlastně, ono je to v ifu :-)
    “Being honest may not get you a lot of friends but it’ll always get you the right ones” ―John Lennon
    Marián Kyral avatar 13.3.2009 14:04 Marián Kyral | skóre: 29 | blog: Sem_Tam | Frýdek-Místek
    Rozbalit Rozbalit vše Re: Grafické programy v Qt 4 - 2 (hlavní okno programu)

    Díky moc, na tohle jsem úplně zapomněl, už to funguje. Taková blbost a já se s tím od včerejška trápím.

    To je tak, když člověk v něčem delší dobu nedělá, pak všechno zapomene :-(

    mirec avatar 13.3.2009 16:47 mirec | skóre: 32 | blog: mirecove_dristy | Poprad
    Rozbalit Rozbalit vše Re: Grafické programy v Qt 4 - 2 (hlavní okno programu)
    Neinicializovaná by mohla byť keby to bol napr. smerník. U objektu sa automaticky spustí konštruktor (a teda objekt bude vždy inicializovaný, v prípade farby predpokladám, že na čiernu farbu).
    LinuxOS.sk | USE="-fotak -zbytocnosti -farebne_lcd +vydrz +odolnost +java" emerge telefon
    13.3.2009 16:50 Ladicek | skóre: 28 | blog: variace | Havlíčkův brod
    Rozbalit Rozbalit vše Re: Grafické programy v Qt 4 - 2 (hlavní okno programu)
    No jo, to jsou ty šílenosti s ukládáním objektů na zásobník. Jak říkám, nejsem Céčkař :-)
    Ještě na tom nejsem tak špatně, abych četl Viewegha.
    15.3.2009 00:03 Deleted [8409] | skóre: 14 | blog: darkblog
    Rozbalit Rozbalit vše Re: Grafické programy v Qt 4 - 2 (hlavní okno programu)
    Ale napsal jste to správně ;-)
    Marián Kyral avatar 13.3.2009 21:09 Marián Kyral | skóre: 29 | blog: Sem_Tam | Frýdek-Místek
    Rozbalit Rozbalit vše Re: Grafické programy v Qt 4 - 2 (hlavní okno programu)

    QColor::QColor ()

    Constructs an invalid color with the RGB value (0, 0, 0). An invalid color is a color that is not properly set up for the underlying window system.

    The alpha value of an invalid color is unspecified.

    http://doc.trolltech.com/4.5/qcolor.html#QColor

    David Watzke avatar 13.3.2009 13:00 David Watzke | skóre: 74 | blog: Blog... | Praha
    Rozbalit Rozbalit vše Re: Grafické programy v Qt 4 - 2 (hlavní okno programu)
    Ta proměnná evidentně není dostupná ve funkci, ve který se jí snažíš použít. Ty QColory fontColorBck, fontLowerColorBck a fontShadowColorBck vytvoř (taky) jako private proměnný třídy (nebo tý funkci předávej ukazatele na ně... tzn. &fontColorBck bude QColor*) a pak by to mělo jít...
    “Being honest may not get you a lot of friends but it’ll always get you the right ones” ―John Lennon
    14.3.2009 14:07 kralyk z abclinuxu | skóre: 29 | blog:
    Rozbalit Rozbalit vše Re: Grafické programy v Qt 4 - 2 (hlavní okno programu)
    Pěkné... To QStettings jsem neznal, zajímavé. Dá se nastavit nějaká úplně jiná cesta k .conf?
    David Watzke avatar 14.3.2009 14:40 David Watzke | skóre: 74 | blog: Blog... | Praha
    Rozbalit Rozbalit vše Re: Grafické programy v Qt 4 - 2 (hlavní okno programu)
    Jo, dá... jeden z konstruktorů je:
    QSettings ( const QString & fileName, Format format, QObject * parent = 0 )
    “Being honest may not get you a lot of friends but it’ll always get you the right ones” ―John Lennon
    14.3.2009 14:41 T.O.M. | skóre: 22 | blog: T.O.M.'s blog | Ostrava
    Rozbalit Rozbalit vše Re: Grafické programy v Qt 4 - 2 (hlavní okno programu)

    Mrkni na pretizene konstruktory, napr.:
    QSettings::QSettings(const QString& fileName, Format format, QObject* parent = 0)

    16.3.2009 15:23 Zdeněk Štěpánek | skóre: 57 | blog: uz_mam_taky_blog | varnsdorf
    Rozbalit Rozbalit vše Re: Grafické programy v Qt 4 - 2 (hlavní okno programu)
    Jsem zdesen.....

    Jsem zvykly na Delphi (jej to je let), tam se tohle vsechno naklikalo za minutu a tady se to musi priserne obskurnim zpusobem matlat spolu se zdrojakem. Brr...

    Zdenek
    www.pirati.cz - s piráty do parlamentu i jinam www.gavanet.org - czfree varnsdorf
    David Watzke avatar 16.3.2009 15:37 David Watzke | skóre: 74 | blog: Blog... | Praha
    Rozbalit Rozbalit vše Re: Grafické programy v Qt 4 - 2 (hlavní okno programu)
    V příštím díle se naklikáš až až, tak si počkej.
    “Being honest may not get you a lot of friends but it’ll always get you the right ones” ―John Lennon
    frEon avatar 19.3.2009 09:05 frEon | skóre: 40 | Praha
    Rozbalit Rozbalit vše Re: Grafické programy v Qt 4 - 2 (hlavní okno programu)
    Pro knihovnu qt existuje taky hromada klikatek, s jejichz pomoci muzes delat gui. Ale je urcite dobre vedet, co se pod tim deje a jak to qt vlastne funguje, aby z nas nebyly klikaci lamy. :-)
    Talking about music is like dancing to architecture.
    19.3.2009 12:37 T.O.M. | skóre: 22 | blog: T.O.M.'s blog | Ostrava
    Rozbalit Rozbalit vše Re: Grafické programy v Qt 4 - 2 (hlavní okno programu)

    Na jednom tydennim oficialnim skoleni, na ktere jsem byl vyslan, se nam skolitel snazil mimo jineho vysvetlit, proc nepouzivat QtDesigner a proc radeji kreslit gui primo z kodu. Je pravda, ze designer nepodporuje spoustu veci, jako vlozeni na toolbar neco jineho nez toolbutton nebo akci z menu, obdobne se statusbarem, moznost rozdelit lokalizaci textu pro jednotne a mnozne cislo (pripadne vice tvaru mnozneho cisla (1 zprava, 2 zpravy, 5 zprav, ...)) nebo napr. pouziti tzv. stretch factoru...

    Ale je pravda, ze stale pouzivam spise designer, protoze vyjma ruznych widgetu na tool/status-baru jsem zatim byl schopny vyjmenovane nevyhody elegantne obejit :-)

    15.12.2012 16:42 Pavel
    Rozbalit Rozbalit vše Re: Grafické programy v Qt 4 - 2 (hlavní okno programu)
    Ahoj,

    první příklad se mi spustí a funguje - lze třeba otevří soubor pomocí Ctr+O, ale hlavní okno programu je úplně prázdné. Neobsahuje menu ani nic jiného. Můj main.cpp (to menšítko u prvního #include mám samozřejmě správně, tady jsem ho smazaal, protože se to jinak považuje za html zančku):

    #include QtGui/QApplication> #include "mainwindow.h"

    int main(int argc, char *argv[]) { QApplication app(argc, argv); MainWindow w; w.show(); return app.exec(); }

    Co dělám blbě? Díky, Pavel

    Založit nové vláknoNahoru

    ISSN 1214-1267   www.czech-server.cz
    © 1999-2015 Nitemedia s. r. o. Všechna práva vyhrazena.