Konu : Basit bir gösterge yapmak.
Soru : Basit bir ibre çizip projeye dahil ettim, fakat bir türlü döndürme işlemini yapamıyorum. Daha önce belirttiğiniz QPainter sınıfını da kullandım ama sonuç alamadım. Yardım ederseniz sevinirim.
Gönderen : R. D.
Cevap: Arkadaşımızın isteği üzerine küçük bir örnek hazırladım. İşin mantığını kavramak ve benzer örnekler yapmak isteyenler için faydalı olacağını düşünüyorum.
ibre.cpp
#include <QtGui>
#include "ibre.h"
ibre::ibre(QWidget *parent)
:QWidget(parent){
donusAcisi = 0;
setBackgroundRole(QPalette::Base);
}
ibre::~ibre(){
}
void ibre::dondur(int derece){
donusAcisi = derece;
update();
}
void ibre::paintEvent(QPaintEvent *){
QPainter painter(this);
//SmoothPixmapTransform : donus sirasinda resim kalitesinin bozulmamasi icin
painter.setRenderHint( QPainter::SmoothPixmapTransform );
QImage imgIbre("ibre90saatYonu.png");
/* x = (width() / 2) ve y = (height() / 2) noktalarinda, yani sayfanin tam ortasında
* yeni bir koordiant sistemi olustur.
* Boylece x=0, y=0 noktalarina cizilen her cizim sayfanin tam ortasinda olur.
*/
painter.translate( width() / 2, height() / 2);
//Aciklama asagidaki "save(); & restore();" kisminda
painter.save();
/*
* dondurme islemi resmin ortasindan degilde kucuk dairenin ortasindan yapilmali.
* X noktasi icin; resmi, genisligi kadar beri getirip, arti olarak dairenin yari capini ekliyorum.
* Ornegin: genişlik = 100px, yaricap = r = 10px olsun, döndürme yapilacak koordinat (0,0) dır.
* X = -100 + r böylece X noktasi kucuk dairesinin tam ortasina konumlanmis olur,
* Y noktasi icin; yaricap kadar da yukari (eksi) kısma cıkarak Y noktasi
* kucuk dairenin ortasina konumlanmis olur.
*
* Not: kucuk dairenin yaricapini, resmin yüksekliğinin yarisini alarak elde ettim. Tam olcum icin
* dairenin altindaki ya da ustundeki bosluklarin olmamasi veya esit olmasi gerek.
*
*/
//girilen aci degerinde dondurme islemini yap.
painter.rotate( donusAcisi + 2.5 ); // +2.5'luk bir deger daha ekleyerek ibre ucu ile sayilari ortaliyorum.
//ve ibreyi ciz
painter.drawImage( -(imgIbre.width()) + (imgIbre.height() /2 ), -(imgIbre.height() /2 ), imgIbre);
/*
* save(); & restore(); Bu iki fonksiyonun arasinda yapilan cizimleri bir katman gibi dusunebilirsiniz.
* Eger ibreyi dondurme kodlarini bu iki fonksiyon arasina yazmasaydim,
* sayilarlarda ibre ile birlikte donerdi.
* İste bu yuzden, bu iki fonksiyon arasini bir katman, diger kisimlari farkli bir katman yaptim.
*/
painter.restore();
//Sayilari ciz
sayilariCiz(painter, imgIbre.width());
//koordinat sistemini eski haline getir. (Geri al. x=0, y=0 en ust olur.)
painter.translate( -(width() /2), -(height() / 2) );
}
void ibre::sayilariCiz(QPainter &p, int ibreGenisligi){
for (int n=0; n<=180; n+=10){
p.drawText( (-ibreGenisligi - 20), 0, QString::number(n));
p.drawText( (-ibreGenisligi + 5), 0, "-");
p.rotate(10);
}
}
Kaynak Kod : ibre.zip
Okulların çıkış saatinde bomba yağdıran, namaz esnasında cami vuran, yolda giden ambulansa roket fırlatan, her türlü insani yardımı engelleyip o insanları bir açık hava hapishanesinde tutan cesur ülke(!) aferin sana.
Terörist diye tabir edip öldürdüğün kişiler bu resimdekiler mi?


Peki ya bunlar; yolda giden ambulansa fırlattığın roketle ölen doktorlar mı?

Bunlarda ellerinde ki ağır silahlar olamalı, değil mi?

Dualarımız seninle Filistin.
Dualarımız seninle Filistin.
Dualarımız seninle Filistin.
"Bu Dua'ya Amin Diyelim" :
Dün mailleri kontrol ederken, uzun zamandır siteden mail gelmediğini fark ettim. Kontrol panelinden onaylanmamış yorumları inceliyordum ki; onca spam yorumdan sonra, yaklaşık iki aydır onay bekleyen yorumların olduğunu gördüm. Evet, sitedeki mail gönderme fonksiyonundan kaynaklanan bir problem yüzünden, yazdığınız yorumların onayı bu kadar uzun sürdü. Yorum yazıp ta, “ulan niye onaylamıyor bu adam, iki ay oldu be” diyen arkadaşlardan özür diliyorum. Kusura bakmayın. :) Az önce bana ait bir grup girdi(Yaklaşık 10 adet), garip bir şekilde gezegende göründü. Bu durumun benden kaynaklanmadığı belirtip, gezegen yetkililerinin duruma bir el atmasını rica ederim.
Not: Girdiler ve site kodlarında herhangi bir güncelleme yapılmamıştır. 21:00 Prison Break (Cnbc-e)
21:30 Benfica – Galatasaray (TRT)
22:00 Bilimin ta Kendisi (NatGeo)
22:15 Breaking Bad (e2)
Ulan nidecez şimdi. :-(
Ne yapalım maçı izleriz herhalde. QT Creator, Trolltech tarafından geliştirilen bir (IDE) uygulama geliştirme ortamıdır. Eğer sadece QT uygulamaları geliştiriyorsanız (şuan için) tam size göre bir ortam. Gayet şık, hızlı ve hafif.
Sisteminize kurmak için aşağıdaki adresden platformunuza en uygun paketi indirebilirsiniz.
http://trolltech.com/developer/qt-creator/qt-creator#download-qt-creator
İlk izlenimlerimi aktarmam gerekirse;
Artıları
- Karşılama penceresi
- Gelişmiş C/C++ Editor
- Tümleşik form tasarımı : Form dosyasını açtığınızda QT Designer bileşenleri ekrandaki yerlerini alıyor ve tasarıma başlayabiliyorsunuz. QT Designer da yaptığınız tüm işlemleri, QT Creator içerisinden de yapabiliyorsunuz. Bir süredir Eclipse içerisinden ki QT Designer bileşenlerini kullanmıyor/kullanamıyordum. Çünkü ara sıra ekran kilitleniyor ya da bileşenler çok geç tepki veriyordu.
- Tümleşik yardım penceresi : Sınıf adının üzerine gelin ve F1 e basın :)
- Program gayet hızlı çalışıyor zaten boyut olarak ta çok küçük, doğal olarak daha az belleğe ihtiyaç duyuyor. (Eclipse göre çok ama çok iyi. Uzun süredir VS.NET kullanmadığım için VS.NET'göre bir kıyaslama yapamıyorum, artık siz deneyip görün)
- Gelişmiş filtre kutusu ile projelerde, kaynak kodlarda, yardım belgelerinde arama yapabilirsiniz.
- Proje oluşturma sihirbazı (QT Designer Form Class benim için çok önemli) : GUI, konsol projeleri ve c++ kütüphanesi(library) oluşturabiliyorsunuz.
- Designer içerisindeki hemen hemen her pencerede filtreleme yapılabiliyor. Bileşenler, özellikler hatta Actions içerisinde filtreleme yapabiliyorsunuz.
- Property Editor'un görüntü tipi değiştirilebiliyor : Bileşenlerin alt alta değilde tıpkı Visual Basic 6 Ya da Delphi 'deki gibi yan yana dizilmesini istiyorsanız Property Editorde sağ tıklayıp görüntü tipini değiştirebiliyorsunuz.
- Build&Run penceresinden çevre değişkenlerini düzenleyebiliyorsunuz.
- Debug desteği : GDB(GNU symbolic debugger) kullanılıyor.
Eksileri QTicari, modüler otomasyon sisteminin beta-1 sürümü kullanıma hazır. Bu sürüm ile birlikte projenin lisansı da, GPLv3 olarak değiştirilmiştir. (Alpha-1 GPLv2 idi)
Projeye destek olmak için :
İlk seçenek tercihimizdir. :-)
Projenin kaynak kodları ve ekran görüntüleri için:
http://www.nesimia.com/projects/qticari adresine tıklayabilirsiniz.
Şuan proje içerisinde iki adet modül, barkod ve ticari modülleri tümleşik olarak gelmektedir. Bu modüller hakkında kısaca bilgi vermek gerekirse;
Ticari: Bünyesinde; cari, stok, kasa, fatura gibi temel muhasebe modüllerini barındıran paket.
Kullanım belgeleri için:
http://forums.nesimia.com/index.php?9 adresine tıklayın.
Barkod: Barkod etiket tasarımı yapıp, çıktı alabilmenize yarayan modül.
Kullanım belgeleri için:
http://forums.nesimia.com/list.php?15 adresine tıklayın.
Ayrıca;
Kurulum ve yapılandırma belgeleri için:
http://forums.nesimia.com/list.php?8 adresine tıklayın.
Forumlar için :
http://forums.nesimia.com/index.php?5 adresine tıklayın.
Önce "Istambul", şimdi de "Ali Baba"
QString t = "Ali Baba";
t.remove(QChar('a'), Qt::CaseInsensitive);
// t == "li Bb"
Kim bu "Ali Baba"?
;) QString Verilerinizde bir takım güncellemeler yaptınız ve tekrar başa dönmek istediniz. rollback() yapmanıza rağmen değişiklikler geri alınmadıysa;
- Tablolarınızın depolama motoru transaction'nı destekleyen yapıya sahip değildir. Örneğin MyIsam gibi. Tablolarınızın depolama motorunu innodb yapabilirsiniz.
- Yazdığınız kodlarda autocommit olayını tetikleyen çağrılar olabilir. Örneğin Stored procedure çağrıları, autocommit olayını tetikleyerek tüm değişiklikleri onaylar. Veritabanı bağlantısı yapılırken "SET AUTOCOMMIT = 0" sorgusunu çalıştırarak autocommit'i kapayabilirsiniz.
MySQL sağolsun, ikincisi ile pek haşır neşir etti beni ;)
Tamam anladık, kontrol basamağının nasıl hesaplanacağına dair bilgileri bir yerlerden bulup kopyaladınız ve sitenize eklediniz. Ama kardeşim, insan bilgilerin doğru olduğunu kontrol etmez mi? İşlem doğru yapılmış mı bir sağlama yapmaz mı?
Konu hakkında birkaç Türkçe makale ile karşılaştım. Anlatılanlar gibi yaparsanız kodunuz sadece EAN 13'de doğru çalışacaktır. Çünkü bir çoğunda, çift hanelerin toplamının 3 katının alınması gerektiği yazıyor. Oysaki EAN 8'de çift, EAN 13'de tek hanelerin toplamının 3 katı alınmalı. Her neyse biraz uğraştırdı ama konu hakkında İngilizce birkaç site(özellikle burası) bulunca sorunu çözdüm. Belki birilerinin işine yara diye yazdığım kodu sıcağı sıcağına buraya da yapıştırıyorum.
barkodUret() - v2 (Güncellendi)
QString seriBarkodTanimlari::barkodUret(int onEk, int baslangic){
QString std = ui.cBoxStandart->currentText();
QString strOnEk = QString::number(onEk);
QString strBaslangic = QString::number(baslangic);
QString barkod;
if ( (std == "EAN 8") || (std == "EAN 13") ){
int uzunluk = strOnEk.length() + strBaslangic.length() + 1; //+1 Kontrol Bit'i için
if ( (std == "EAN 8") && (uzunluk > 8) ) return QString();
else if ( (std == "EAN 13") && (uzunluk > 13) ) return QString();
if (std == "EAN 8") barkod.fill('0',8 - uzunluk);
else barkod.fill('0',13 - uzunluk);
barkod = strOnEk + barkod + strBaslangic;
uzunluk = barkod.length();
int tek = 0;
int cift = 0;
for (int i=0; i<uzunluk; i++){
if ( i%2) tek += barkod.mid(i,1).toInt();
else cift += barkod.mid(i,1).toInt();
}
int toplam;
if (std == "EAN 8") toplam = (cift * 3) + tek;
else toplam = (tek * 3) + cift;
int onunKati;
if (toplam%10 != 0)
onunKati = QString(QString::number(QString::number(toplam).mid(0, QString::number(toplam).length() - 1 ).toInt() + 1) + "0").toInt();
else
onunKati = toplam;
int checkDigit = onunKati - toplam;
return barkod + QString::number(checkDigit);
}
else return QString();
}
|