Sada je: 28 ožu 2024, 13:01.
C, C++, Java, PHP, Ruby...

Moderator/ica: Moderatori/ce

Pravila foruma
U naslovu teme unutar uglatih zagrada navesti o kojem jeziku je riječ. Primjer: [Java]
Evo sad sve u jednom paketu i trebalo bi raditi u Windowsima:

http://podrucna-skola-jamarice.kuhinje- ... elease.zip
Postovi: 135
Postovi: 135
Pridružen/a: 18 stu 2010, 06:51
Lokacija: Sesvetski Kraljevec
Podijelio/la zahvalu: 2 puta
Primio/la zahvalu: 4 puta
Spol: M
OS: Windows 7
Kako u Qt napraviti bojanku? Nešto slično ovome:
http://www.igre123igrice.com/bojanke/st ... janka.html
Krenem od kliknutog pixela i petljama ispitujem boju okolnih? Pa ako su isti kao kliknuti, onda ih obojam?
Postovi: 135
Postovi: 135
Pridružen/a: 18 stu 2010, 06:51
Lokacija: Sesvetski Kraljevec
Podijelio/la zahvalu: 2 puta
Primio/la zahvalu: 4 puta
Spol: M
OS: Windows 7
To se zove Flood fill.

btw, rekurzija je bog! :D
Avatar
Postovi: 408
Postovi: 408
Pridružen/a: 15 lis 2013, 01:42
Lokacija: BiH, Kakanj
Podijelio/la zahvalu: 46 puta
Primio/la zahvalu: 30 puta
Spol: M
OS: Arch / Manjaro / #!
Evo me opet... oran za nastavak!
I evo odmah prvog problema. Trebam po formi (prozoru) pisati slova. Pišem ih tako da nižem krugove jedan do drugoga, a koordinate čitam iz fajla. Tako sam to radio prije, ali u Visual Basicu. Ovdje mi je prvi problem nacrtati na formi bilo što. Odgledao sam ovaj filmić:

https://www.youtube.com/watch?v=5JE5ek_oN_0

I sve okej i povučem liniju, nacrtam krug ili pravokutnik, ali samo kod pokretanja programa. Doduše, ne radim sa Dialog kao ovaj u filmiću, nego sa MainWindow. Ako te dvije linije napišem ovdje:

Kod: Označi sve
void MainWindow::paintEvent(QPaintEvent *e)
{
    QPainter painter(this);
    painter.drawLine(10,10,1000,800);
}

... ona se nacrta. No ako ih napišem u neki drugi void:

Kod: Označi sve
void MainWindow::on_pushButton_3_clicked()
{
    QPainter painter(this);
    painter.drawLine(10,10,1000,800);
}

... ona se ne nacrta, a ja trebam baš to - neko crtanje nakon što kliknem.
Postovi: 135
Postovi: 135
Pridružen/a: 18 stu 2010, 06:51
Lokacija: Sesvetski Kraljevec
Podijelio/la zahvalu: 2 puta
Primio/la zahvalu: 4 puta
Spol: M
OS: Windows 7
Koristiš QPainter na krivi način.

QPainter se koristi u paintEvent virtualnoj funkciji:
The common use of QPainter is inside a widget's paint event: Construct and customize (e.g. set the pen or the brush) the painter. Then draw. Remember to destroy the QPainter object after drawing.
[izvor]

Dalje, ako želiš ručno pozivati paintEvent, to ne možeš direktno. Moraš pozivati update ili repaint funkciju. [izvor]

Predlažem da malo proguglaš, ima puno materijala online.
Npr.:
Like some other animals, the gecko can perform a neat trick when threatened by a predator: it can amputate its own tail. The dropped tail serves to distract the predator, and by losing it, the lizard can run faster.
Avatar
Moderator
Postovi: 4366
Moderator
Postovi: 4366
Pridružen/a: 28 sij 2009, 18:46
Podijelio/la zahvalu: 86 puta
Primio/la zahvalu: 148 puta
Spol: M
OS: openSUSE Leap KDE
Zahvaljujem... ali ne mogu sam skužiti. S this.update nestanu mi stari krugovi i pojavi se novi. A cilj je da se ispunjenim kružićima, nizanjem gusto jednog do drugoga, ispisuje slovo onim smjerom kojim se u naravi isto slovo piše na papiru (demonstracija načina pisanja slova). Budući da se u pisanju slova često olovka povlači po već ispisanoj liniji, onda mora biti i neki kružić druge boje koji glumi olovku. Tempo ispisa je također nužno regulirati. Sve sam to već radio u VB i funkcionira dobro, ali u VB bilo gdje pukneš naredbu circle (x,y,radius,fill) i to je to. Kružić ostane i do njega stavljam drugoga...
Postovi: 135
Postovi: 135
Pridružen/a: 18 stu 2010, 06:51
Lokacija: Sesvetski Kraljevec
Podijelio/la zahvalu: 2 puta
Primio/la zahvalu: 4 puta
Spol: M
OS: Windows 7
maliodpalube je napisao/la:S this.update nestanu mi stari krugovi i pojavi se novi.


Onda u paintEvent-u crtaj sve krugove koje je potrebno vidjeti u tom trenutku, a ne samo "nadodati" nove.
Like some other animals, the gecko can perform a neat trick when threatened by a predator: it can amputate its own tail. The dropped tail serves to distract the predator, and by losing it, the lizard can run faster.
Avatar
Moderator
Postovi: 4366
Moderator
Postovi: 4366
Pridružen/a: 28 sij 2009, 18:46
Podijelio/la zahvalu: 86 puta
Primio/la zahvalu: 148 puta
Spol: M
OS: openSUSE Leap KDE
Mučim se, ali ne ide. Evo primjer koda:

Kod: Označi sve
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QTime>

int crtaj;
void cekaj(int);

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    crtaj=0;//flag da se ne crta kod pokretanja programa
}

MainWindow::~MainWindow()
{
    delete ui;
}
void MainWindow::paintEvent(QPaintEvent *e)
{
    if(crtaj==1)
    {
        QPainter painter(this);
        painter.setPen(Qt::red);
        painter.setBrush(Qt::red);
        painter.drawEllipse(QPoint(100,100),10,10);
        //cekaj(3000);
        painter.drawEllipse(QPoint(130,130),10,10);

    }
}

void MainWindow::on_pushButton_clicked()
{
    if(crtaj==0)
        crtaj=1;
    else
        crtaj=0;
    this->update();
}
void cekaj( int milisekunde )
{
    QTime dieTime = QTime::currentTime().addMSecs( milisekunde );
    while( QTime::currentTime() < dieTime )
    {
        QCoreApplication::processEvents( QEventLoop::AllEvents, 100 );
    }
}


Radi prema očekivanju, ali ako uključim onu liniju cekaj(3000); koja bi trebala ubaciti pauzu između crtanja dva kruga, on mi kaže: QWidget::repaint: Recursive repaint detected

Edit:
Zapravo se stvar svodi na pitanje kako nacrtati neki određeni broj ispunjenih krugova koji se gusto nižu jedan na drugoga, ali s pauzom od nekoliko milisekundi, tako da se stvori utisak da neka nevidljiva olovka piše slovo po ekranu otprilike onom brzinom kojom ga piše i dijete u prvome razredu. Krugovi su svi isti - cca 5 px promjera, a koordinate središta čitaju se iz neke datoteke. Za svako slovo će ih biti cca oko 1000.
Postovi: 135
Postovi: 135
Pridružen/a: 18 stu 2010, 06:51
Lokacija: Sesvetski Kraljevec
Podijelio/la zahvalu: 2 puta
Primio/la zahvalu: 4 puta
Spol: M
OS: Windows 7
Riješio sam tu nesretnu pauzu od 8 milisekundi koju trebam između krugova. Budući da pauza ne pali unutar paintEventa, smjestio sam je izvan u nekoj petlji, ali to zapravo znači da to slovo crtam ispočetka onoliko puta koliko krugova čini jedno slovo (cca 1000 puta).
Jer:
stefan je napisao/la:Onda u paintEvent-u crtaj sve krugove koje je potrebno vidjeti u tom trenutku, a ne samo "nadodati" nove.


Ovo mi čini jako čudno da u Qt sve ono što misliš nacrtati na formi moraš nacrtati u istom času i kasnije više ne možeš "docrtavati" što te volja. U svakom slučaju, dok ne nađem bolje rješenje (da baš ne kažem - normalno rješenje - da docrtavam kad me volja), ovo neka stoji. Radi fino, a to što jedno isto slovo crtam oko 1000 puta ispočetka, da bih ga nacrtao do kraja - nek stoji...

...jer imam novi problem. Nikako mi to sada ne uspijeva smjestiti na scrollArea. Čačkam po stranim forumima, ali kad se zbroje moje dvije skromnosti (znanje Qt-a i znanje engleskog), rezultat su samo dani čačkanja... Ima li negdje neki primjer kako nacrtati krug na scrollArea? Ili da mi netko tko zna to napiše na brzinu - iz primjera ću najlakše skužiti.
Unaprijed zahvaljujem...
Postovi: 135
Postovi: 135
Pridružen/a: 18 stu 2010, 06:51
Lokacija: Sesvetski Kraljevec
Podijelio/la zahvalu: 2 puta
Primio/la zahvalu: 4 puta
Spol: M
OS: Windows 7
Uf... odustao sam od crtanja krugova direktno na formu. Umjesto toga sam napravio potreban broj labela i u njih sa pixmap stavio slikicu kružića s diska i to u .png formatu, tako da je sve osim kružića prozirno. S time radim što hoću, jer svaku labelu mogu staviti na ->show() kad god mi paše.

Sljedeći problem:
Imam scrollArea u kojem podižem stranice pojedinog udžbenika. Pojavljuje mi se samo vertikalni scroll. Ako "spustim" scrollom neku stranicu do dolje i onda pozovem drugu, ta druga se pojavi spuštena do dolje. Kako da iz koda natjeram taj scroll da bude na vrhu, odnosno da se nova stranca opet prikazuje od vrha scrollArea?
Postovi: 135
Postovi: 135
Pridružen/a: 18 stu 2010, 06:51
Lokacija: Sesvetski Kraljevec
Podijelio/la zahvalu: 2 puta
Primio/la zahvalu: 4 puta
Spol: M
OS: Windows 7

Na mreži
Trenutno korisnika/ca: / i 9 gostiju.