http___qt-project.org_wiki_Temel_Qt_Programlama_Egitimi_1.xml
1.1 2.1 3.1 3.2 3.3 3.4 3.5 3.6 3.7 3.8 4.1 5.1 5.2 5.3 5.4 5.5 5.6 5.7 5.8 6.1 6.2 6.3 7.1 7.2 7.3 8.1 9.1 10.1 11.1 12.1 13.1 14.1 16.1 18.1 18.2 19.1 21.1 22.1 23.1 24.1 25.1 28.1 28.2 28.3 28.4 29.1 29.2 29.3 29.4 29.5 29.6 30.1 30.2 31.1 32.1 34.1 36.1 38.1 39.1 40.1 41.1 42.1 43.1 44.1 45.1 46.1 47.1 49.1 50.1 51.1 53.1 54.1 55.1 57.1 59.1 61.1 63.1 64.1 65.1 66.1 68.1 68.2 69.1 71.1 73.1 76.1 78.1 81.1 81.2 81.3 81.4 82.1 82.2 82.3 82.4 82.5 83.1 84.1 85.1 86.1 87.1 88.1 89.1 90.1 91.1 93.1 95.1 97.1 99.1 101.1 102.1 104.1 106.1 108.1 109.1 110.1 112.1 114.1 118.1 119.1 119.2 119.3 119.4 120.1 122.1 124.1 125.1 127.1 129.1 129.2 130.1 130.2 130.3 131.1 131.2 132.1 134.1 135.1 137.1 137.2 137.3 138.1 138.2 138.3
[Solved] Random number generator with a time interval Hello, I am new to this forum and still pretty new at using the Qt program, so please be patient with me. I am working on a program that after a certain amount of time a new random number appears on the GUI. How I want it is that when a button is pressed within the GUI, the random number generator starts and displays its first random number. Once a certain amount of time has passed (lets say 15 secs), a new random number is then displayed within the GUI. I have gotten a suggestion of using a timer interrupt within the program, but I am having a hard time finding a decent example of it. I am not an advanced programmer, so please once again, be patient with me. I really do appreciate all the help. Thank you very much for any type of advice. 15 replies Thank you for the advice. I have been looking into the QTimer function for a while today and I am still confused on how to use the “connect(timer,SIGNAL),this,SLOT)” function. The main part about it is I am unsure about what I need to put in the “SLOT” section. I would like my GUI to have it when the button is pressed the first random number is displayed on the label, then a certain amount of time goes by, then another random number is displayed. The only way to get out of that loop is by clicking the button again. That is why I thought I would have to put clicked() for the SLOT section. But it did not work. A message would come up saying no such slot MainWindow::clicked() in… Slot is a method you create yourself in your code (although, of course, some Qt classes have some convenient slots prepared) that reacts to a signal in a way you desire. A detailed description can be found here [qt-project.org] but it can be hard to grasp for a newbie. I’ll try to explain it in a bit simpler manner. So, your QTimer will emit a signal (timeout) every few seconds. What you want to do is to then get a new random number, and update the label. To achieve this, you should add a slot in your code: - // MainWindow.h - private slots: - void updateRandomNumber(); - // your timer: - QTimer timer; - // MainWindow.cpp - void MainWindow::updateRandomNumber() - ui->myLabel->setText(QString::number(qRand())); - // signal and slot connection. You probably do it in your button clicked slot - void MainWindow::on_pushButton_clicked() - if (timer.isActive()) { - timer.stop(); // timer will stop if you click the button again - } else { - connect(&timer, SIGNAL(timeout()), this, SLOT(updateRandomNumber())); - timer.start(1000); I will defiantly try this. I was getting confused on where I should put the information for the QTimer class. I was putting that information in my .cpp instead of my .h. In doing that, does that answer the question into why the “redefinition” and “previous” class type errors kept on popping up every time I would build my GUI? I will first add your suggestions into my code. If I am still having trouble, I will post my code on there. Please do not laugh or judge me too much on it when you see it. I am not a pro at programming. Please be patient with me. Once again, thank you so much for giving me pointers when dealing with this code. I have input your suggestions in my mainwindow.h file and mainwindow.cpp, but every time I click the pushButton the first time, the GUI exits unexpectedly instead of start the RNG. Below is my code: - //mainwindow.h - namespace Ui - class MainWindow; - class MainWindow:public QMainWindow - Q_OBJECT - public: - explicit MainWindow(QWidget *parent = 0); - ~MainWindow(); - private slots: - void on_pushButton_clicked(); - void updateRandomNumber(); - private: - Ui::MainWindow *ui; - QTimer *timer; - #endif // MAINWINDOW_H - //MainWindow.cpp - ui(new Ui::MainWindow) - ui->setupUi(this); - ui->max->setValidator(new QIntValidator(0,100000000)); - ui->min->setValidator(new QIntValidator(0,100000000)); - MainWindow::~MainWindow() - delete ui; - void MainWindow::updateRandomNumber() - int high = ui->max->text().toInt(); - int low = ui->min->text().toInt(); - qsrand((unsigned)time(0)); - ui->label->setText(QString::number(qrand()%((high + 1) - low) + low)); - //Control timer with the pushButton. RNG should activate. - void MainWindow::on_pushButton_clicked() - if(timer->isActive()) - connect(timer,SIGNAL(timeout()),this,SLOT(updateRandomNumber())); - else - timer->stop();//timer will stop if you click button again. At first I kept your suggestion and had the “connect” function after the else statement, but it was still exiting out the program unexpectedly. I wanted the user to input their min and max value within the GUI and the random values stay within those values. Do you have any suggestions on why it keeps kicking me out of the GUI after I press the pushButton? Thank you once again for your help. Okay, I did a practice code on getting the timer and random number generator to be in sync. That came out fine. Once the pushButton is pressed, the RNG starts with the delay timer I asked for, but after I press the button again, it does not want to stop the RNG even though I have the disconnect command inputted in my code. Any suggestions on why this is would be lovely :) Below is my code. Thank you once again for your help Mr. sierdzio. - //mainwindow.cpp - #include "mainwindow.h" - #include "ui_mainwindow.h" - #include "cstdlib" - #include "stdlib.h" - #include "string" - #include "QTimer" - #include "QObject" - ui(new Ui::MainWindow) - ui->setupUi(this); - MainWindow::~MainWindow() - delete ui; - void MainWindow::updateRandomNumber() - qsrand((unsigned)time(0)); - ui->label->setText(QString::number(qrand())); - void MainWindow::on_pushButton_clicked() - if(timer->isActive()) - QObject::disconnect(this,SLOT(updateRandomNumber(void))); - //delete updateRandomNumber; - timer->stop();//timer will stop if you click the button again. - else - connect(timer,SIGNAL(timeout()),this,SLOT(updateRandomNumber())); Oh, it seems we have been writing a post in parallel :) You are initialising the timer in wrong place! Every time you click a button, you create a new QTimer. This is a bad memory leak, and will not work as intended. Move the initialisation to the constructor: - ui(new Ui::MainWindow) - ui->setupUi(this); when I moved it to - ui(new Ui::MainWindow) - ui->setupUi(this); It would exit out of the GUI unexpectedly after I push the pushButton. But once it is back under The GUI does not exit out, the RNG timer works after I press the pushButton for the first time, but the RNG timer will not stop once the pushButton is pressed for a second time. Thank you for your help and your patience. It is greatly appreciated. Sorry, I made a small mistake. My previous snippet should have been: - ui(new Ui::MainWindow) - ui->setupUi(this); - timer = new QTimer(this); As you see, no “QTimer *”. This is because we want to initialise the timer present in the header file, and not a completely new one. You can also move the connect statement to the constructor, and remove the disconnect statement – it should still work correctly. You must log in to post a reply. Not a member yet? Register here!
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.