http___qt-project.org_wiki_Temel_Qt_Programlama_Egitimi_1.xml
1.1 2.1 4.1 4.2 5.1 6.1 7.1 7.2 8.1 9.1 10.1 10.2 10.3 10.4 11.1 12.1 13.1 14.1 15.1 17.1 18.1 19.1 20.1 21.1 23.1 24.1 25.1 26.1 27.1 29.1 30.1 30.2 30.3 30.4 31.1 32.1 33.1 34.1 34.2 35.1 36.1 37.1 38.1 38.2 38.3 38.4 38.5 39.1 40.1 41.1 41.2 42.1 43.1 44.1 45.1 45.2 46.1 46.2 46.3 47.1 48.1 49.1 50.1 51.1 51.2 51.3 51.4 52.1 52.2 52.3 53.1 53.2 54.1 55.1 56.1 57.1 58.1 59.1 60.1 60.2 61.1 62.1 62.2 62.3 63.1 63.2 64.1 65.1 66.1 67.1 68.1 69.1 71.1 72.1 73.1 74.1 76.1 77.1 77.2 78.1 79.1 79.2 80.1 80.2 81.1 82.1 83.1 84.1 86.1 87.1 88.1 89.1 90.1 91.1 93.1 93.2 94.1 95.1 95.2 96.1 97.1 98.1 98.2 98.3 99.1 100.1 101.1 102.1 103.1 103.2 104.1 105.1 106.1 107.1 108.1 108.2 108.3 109.1 110.1 111.1 112.1 114.1 115.1 116.1 118.1 119.1 120.1 121.1 122.1 123.1 125.1 126.1 127.1 128.1 130.1 131.1 132.1 133.1 134.1 135.1 137.1 138.1 139.1 140.1 141.1 143.1 144.1 144.2 145.1 146.1 147.1 148.1
Table of Content Qt for beginners — A pretty button This chapter gives an overview of the widgets modules. It will cover widgets properties, the inheritance scheme that is used in widgets, and also the parenting system. A pretty button Now that we have our button, we may want to customize it a bit. Qt objects have a lot of attributes that can be modified using getters and setters. In Qt, if an attribute is called foo, the associated getter and setter will have these signatures - T foo() const; - void setFoo(const T); In fact, Qt extends this system of attributes and getters and setters to something called property. A property is a value of any type that can be accessed, be modified or constant, and can notify a change. The property system is useful, especially in the third part (QML). For now, we will use “attribute” or “property” to do the same thing. A QPushButton has plenty of properties : - text - font - tooltip - icon So we can use these to customize the button. Let’s first change the text and add a tooltip - #include - #include - int main(int argc, char **argv) - QPushButton button; - button.setText("My text"); - button.setToolTip("A tooltip"); - button.show(); - return app.exec(); Here is the result We can also change the font. In Qt, a font is represented with the QFont class. The documentation provides a lot of information. We are especially concerned here with one of the constructors of QFont. In order to change the font, we have to instantiate a QFont class, and pass it to the QPushButton using setFont. The following snippet will change the font to Courier. - QFont font ("Courier"); - button.setFont(font); You can try other parameters of QFont’s constructor to reproduce the button that is represented in the first picture in this chapter. Setting an icon is not very difficult either. An icon is represented with the QIcon class. And you can create an icon provided that it has an absolute (or relative) path in the filesystem. I recommend providing the absolute path in this example. But for deployment considerations, you might use the relative path, or better, the resource system. - QIcon icon ("/path/to/my/icon/icon.png"); - button.setIcon(icon); On Linux, and some other OS’s, there is a convenient way to set an icon from an icon theme. It can be done by using the static method For example, in the screenshot at the beginning of this chapter, the smiley comes from the Oxygen KDE icon theme and was set by - button.setIcon(QIcon::fromTheme("face-smile")); Qt class hiearchy Qt widely uses inheritance, especially in the Widgets module. The following graph shows some of these inheritance QObject is the most basic class in Qt. Most of classes in Qt inherit from this class. QObject provides some very powerful capabilities like : - object name : you can set a name, as a string, to an object and search for objects by names. - parenting system (described in the following section) - signals and slots (described in the next chapter) - event management Widgets are able to respond to events and use parenting system and signals and slots mechanism. All widgets inherit from QObject. The most basic widget is the QWidget. QWidget contains most properties that are used to describe a window, or a widget, like position and size, mouse cursor, tooltips, etc. Remark : in Qt, a widget can also be a window. In the previous section we displayed a button, that is a widget, but it appears directly as a window. There is no need of a “QWindow” class. Nearly all graphical elements inherit from QWidget. We can list for example - QAbstractButton, a base class for all button types - QPushButton - QCheckBox - QRadioButton - QFrame, that displays a frame - QLabel, that displays text or picture This inheritance is done in order to facilitate properties management. Shared properties like size are cursors can be used on other graphical components, and QAbstractButton provides basic properties that are shared by all buttons. Parenting system Parenting system is a convenient way of dealing with objects in Qt, especially widgets. Any object that inherits from QObject can have a parent and children. This hierarchy tree makes many things convenient : - When an object is destroyed, all of its children are destroyed as well. So calling delete becomes optional in certain cases - All QObjects have findChild and findChildren methods that can be used to search for children of a given object. - Child widgets in a QWidget automatically appear inside the parent widget. The following snippet that creates a QPushButton inside a QPushButton: - #include - #include - int main(int argc, char **argv) - QPushButton button1 ("test"); - QPushButton button2 ("other", &button1); - button1.show(); - return app.exec(); You can also note that when the application is closed, button1, which is allocated on the stack, is deallocated. Since button2 has button1 as a parent, it is deleted also. You can even test this in Qt Creator in the analyze section, by searching for a memory leak—there won’t be any. There is clearly no benefit in putting a button inside a button, but based on this idea, we might want to put buttons inside a container, that does not display anything. This container is simply the QWidget. The following code is used to display a button inside a widget - #include - #include - int main(int argc, char **argv) - QWidget window; - window.setFixedSize(100, 50); - QPushButton *button = new QPushButton("Hello World", &window); - button->setGeometry(10, 10, 80, 30); - window.show(); - return app.exec(); Note that we create a fixed size widget (that acts as a window) using setFixedSize. This method has the following signature - void QWidget::setFixedSize(int width, int height); We also positioned the button using setGeometry. This method has the following signature - void QWidget::setGeometry(int x, int y, int width, int height); Subclassing QWidget Until now, we have put all of our code in the main function. This was not a problem for our simple examples, but for more and more complex applications we might want to split our code into different classes. What is often done is to create a class that is used to display a window, and implement all the widgets that are contained in this window as attributes of this class. Inside Qt Creator, you can automatically create a new class with File > New file or project > C++ > C++ Class Make the class inherit from QWidget, and you should obtain code similar to below Header Source You can see that Qt Creator automatically generates a class template. Notice that there are some new elements in the header : - The Q_OBJECT macro. - A new category of methods : signals - A new category of methods : public slots All these elements will be explained in the next chapter, and none of them are needed now. Implementing the window is done in the constructor. We can declare the size of the window, as well as the widgets that this window contains and their positions. For example, implementing the previous window that contains a button can be done in this way : main.cpp - #include - #include "window.h" - int main(int argc, char **argv) - Window window; - window.show(); - return app.exec(); window.h - #ifndef WINDOW_H - #define WINDOW_H - #include - class QPushButton; - class Window : public QWidget - public: - explicit Window(QWidget *parent = 0); - private: - QPushButton *m_button; - #endif // WINDOW_H window.cpp - #include "window.h" - #include - Window::Window(QWidget *parent) : - QWidget(parent) - // Set size of the window - setFixedSize(100, 50); - // Create and position the button - m_button = new QPushButton("Hello World", this); - m_button->setGeometry(10, 10, 80, 30); Please note that there is no need for writing a destructor for deleting m_button. With the parenting system, when the Window instance is out of the stack, the m_button is automatically deleted. See Also A better overview of QPushButton is given in this wiki page How to use QPushButton
1.1 2.1 3.1 4.1 5.1 6.1 7.1 8.1 9.1 10.1 11.1 12.1 13.1 14.1 15.1 16.1 17.1 18.1 19.1 20.1 21.1 22.1 23.1 24.1 25.1 26.1 27.1 28.1 30.1 31.1 33.1 35.1 37.1 38.1 39.1 40.1 41.1 42.1 44.1 46.1 47.1 48.1 49.1 50.1 51.1 53.1 54.1 56.1 57.1 58.1 59.1 60.1 61.1 63.1 65.1 67.1 69.1 71.1 72.1 75.1 86.1 101.1 104.1 113.1 114.1 115.1 116.1 117.1 118.1 119.1
Table of Content Türkçe English 简体中文 فارسی Español Giriş Bu ders Qt-Creator tümleşik geliştirme ortamı (IDE) kullanarak pragramlama için ilk adımları ayrıntılı olarak açıklamaktadır. Not: Bu ders sadece Qt’ye yeni başlayanlar için bir giriş niteliğindedir. Ot ile grafik kullanıcı arayüzü (GUI) hazırlamak oldukça kolaydır. Aynı zamanda hazırdadığınız arayüzler birçok platformda sorunsuz çalışmaktadır. Programlamaya başlamadan önce aşağıdakilerin sisteminizde kurulu olması gerekmektedir. - Qt Creator (Yaygın tüm platformlarda kullanabilirsiniz. Windows, Linux, Mac os) - Qt Libraries 4.8.3 for windows (Windows için ikili paketi) Kurulum Dosyalarını Buradan indirebilirsiniz. —> http://qt-project.org/downloads Kurulumun nasıl yapıldığıyla ilgili bu sayfadan [qt-project.org] bilgi alabilirsiniz. Not: Diğer işletim sistemleri üzerinde kullanmak isteyen arkadaşlarda aynı şekilde ilgili paketleri indirdikten sonra kullanmaya başlayabilir. Aynı zamanda Windows işletim sistemi üzerinde Visual Studio kullanılarakta geliştirme yapılabilir. Visual Studio kullanacak arkadaşlar Qt Libraries 4.8.3 veya başka bir sürümünü indirdikten sonra Qt Visual Studio Add-in eklentisini kurarak Visual Studio üzerinde geliştirme yapabilir. İlk Adım : Yeni Bir Proje Oluşturma - Qt Creator Başlatın - Sırasıyla File – New File or Project – Applications – Qt Gui Application seçtikten sonra Choose butonuna tıklayınız. - Açılan ekranda Name: karşısına proje için bir isim verdikte sonra Create in: karşısına projenin dizinini seçerek Next’e tıklayınız. - Qt ile hangi platformlara derleme yapılacağını soran bu ekranda Desktop seçerek masaüstüne derleme yapacağımızı bildirerek Next butonuna tıklıyoruz. - Açılan ekrandan Base Class yazan kısımdan hangi sınıftan türetme yapacağımızı şeçiyoruz. QMainWindow seçerek uygulamamız için bir anapencere oluşturmasını bununla birlikte bir başlık dosyası ve kaynak dosyası ile birlikte tasarım yapacağımız .ui uzantılı dosyayı oluşturmasını söylüyoruz. Next Butonuna tıklıyoruz. - Bu son dialog penceresinde ise eğer bir version kontrol sistemi kullanıyorsak Add toversion control: kısmından bunu seçebiliriz. Şu an none seçili kalacaktır. Son olarak Finish butonuna tıklayarak projemi oluşturuyoruz. Proje açıldıktan sonra 4 adet dosya oluşacaktır. Bunlar: - main.cpp - mainwindow.h - mainwindow.cpp - mainwindow.ui İkinci Adım : Proje Dosyalarına Gözatma - main.cpp - #include "mainwindow.h" - #include - int main(int argc, char *argv[]) - QApplication a(argc, argv); - MainWindow w; - return a.exec(); Yukarıda bulunan main fonksiyonu programın başlangıç fonksiyonudur. Main fonksiyonu içerisinde bir adet QApplication nesnesi oluşturuyoruz, Qt ile uygulamamızı çalıştırmak için tüm programlarda bu nesne oluşturulmak zorundadır, bu nesne programımız için arkaplanda bir döngü oluşturarak programımızın sürekli ekranda kalmasını sağlıyor. Daha sonra yaptığımız arayüzden bir nesne oluşturuyoruzki bu nesne bizim ana ekranımız yani QMainWindow sınıfından türetme yaptığımız sınıfın bir örneğini oluşturuyoruz. w.show(); fonksiyonunu çalıştırarak ekranda gözükmesini sağlıyoruz. return a.exec(); fonksiyonu ile uygulamayı QApplication’a devrediyoruz. - mainwindow.h - #ifndef MAINWINDOW_H - #define MAINWINDOW_H - #include - namespace Ui { - class MainWindow; - class MainWindow : public QMainWindow - Q_OBJECT - public: - explicit MainWindow(QWidget *parent = 0); - ~MainWindow(); - private: - Ui::MainWindow *ui; - #endif // MAINWINDOW_H Burası ana penceremizin başlık dosyasıdır. Q_OBJECT makrosu Qt içerisinde bulunan sinyal slot mekanızmasını kullanmak için eklenen bir makrodur. Bu konu ileride anlatılacaktır. explicit MainWindow(QWidget *parent = 0); burası sınıfın yapıcı fonksiyonu, QWidget *parent = 0 diyerek sınıfımızın başka bir sınıfa veyahut widgette diyebiliriz ait olmadığını belirtir, ileride görecemiz gibi bir nesne başka bir nesneye ait olabilmektedir. ~MainWindow(); burası yıkıcı fonksiyonumuz. private kısımda bulunan Ui::MainWindow *ui; designer ekranında oluşturduğumuz arayüze bir gösterici tanımlamaktadır. - mainwindow.cpp - #include "mainwindow.h" - #include "ui_mainwindow.h" - MainWindow::MainWindow(QWidget *parent) : - QMainWindow(parent), - ui(new Ui::MainWindow) - ui->setupUi(this); - MainWindow::~MainWindow() - delete ui; Burası projemizin kaynak dosyası, başlık dosyamızda tanımlanan fonksiyonların içerikleridir. ui->setupUi(this); fonksiyonu #include “ui_mainwindow.h” olarak eklediğimiz dosya içerinde Qt Creator tarafından oluşturulan otomatik bir fonksiyondur. Qt ile hazırladığımız arayüzler .ui dosyalarında xml yapısı kullanılarak tutulur. Projeji derlediğimizde MOC tarafından bunlar kaynak koda çevrilirler işte bu kaynak kod ui_mainwindow.h dosyasının ta kendisidir. Bunun içeriğini görebilmek için en az bir kez derleme yapmalıyızki MOC tarafından kodları oluşturulsun. - mainwindow.ui Bu dosyanın içeriği aşağıdaki gibi bir xml yapı içerisindedir. Bunlarda genellikle üzerinde değişiklik yapılmaz bu dosya sadece ekran üzerinde bulunan nesnelerin konum bilgileri vs. gösterir. Programın çalışma anına ilişkin bir dosya değildir. Derleyicinin gördüğü asıl dosya üretilen ui_mainwindow.h dosyasının içeriğidir. -  MainWindow -  MainWindow -  TopToolBarArea -  false Üçüncü Adım : Proje Dosyalarını Düzenleme Proje üzerine bir adet yazı gösteren bileşen ve bir adet tıklama ögesi yani buton eklenmek istenmektedir. Bu 2 bileşene widget denilmektektedir. Qt üzerinde kullanacağınız tüm arayüz nesneleri widget olarak adlandırılır. Birçok widget hazır olarak kurulu gelmiş olsada kendinizde bir widget ekleyebilirsiniz, lakin bunlar biraz ileri seviye konular olduğu için bu kısımda anlatılmayacaktır. mainwindow.ui dosyasına çift tıkladığınızda bir designer penceri açılacak, orta kısımda üzerinde çalıştığımız form nesnesi bulunmaktadır.(MainWindow Arayüzü). sol tarafta ise form üzerinde kullanacağımız widgetler bulunur. Sol taraftan bir adet QLabel ve QPushButton widgetini sürükleyerek form üzerine bırakınız. Dördüncü Adım : Proje Derleme ve Çalıştırma Projeyi kaydettikten sonra Build menüsünden Build Project seçerek veya Ctrl + B tuş kombinasyonunu kullanarak derleyebilirsiniz. Veya Derlemek ve sonrasında çalıştırmak için Build menüsünden Run seçerek veya Ctrl + R tuş kombinasyonunu kullanarak hem derleyip hem çalıştırabilirsiniz. Not: Aynı zamanda komut satırı kullanılarakta ilgili derleyiciye bağlı olarak derleme ve bağlama işlemini gerçekleştirebilirsiniz.