Pemrograman Qt 17 Pan, Scroll, Zoom, Flip, dan Rotate untuk QGraphicsView

dokumen-dokumen yang mirip
Pemrograman Qt 19 Membaca dan Menuliskan Standard Output ke QTextEdit Secara Realtime

Pemrograman Qt 14 QPropertyAnimation untuk Animasi GUI

Pemrograman Qt 13 Logo Program dengan setwindowicon

Pemrograman Qt 11 Phonon Framework untuk Memutar Audio OGG Ketika QPushButton Diklik

Pemrograman Qt 8 QVBoxLayout, QHBoxLayout, QGridLayout dan Sifat-Sifatnya

Pemrograman Qt 20 QSystemTrayIcon untuk Membuat Aplikasi System Tray

Pemrograman Qt 18 QTextStream untuk Membuat Aplikasi Proxy Changer

Wujud Program yang Diinginkan

Pemrograman Qt 12 Kalkulator Sederhana dengan QLineEdit dan Casting QString to int

Pemrograman Qt 10 QTextEdit, QFile, QTextStream, QLabel, Membaca Standard Output Shell, Membaca Berkas, dan Membuat Berkas TXT

Pemrograman Qt 9 QProcess dan Menjalankan Perintah Linux

TIPS LATIHAN MEMROGRAM

Pemrograman Qt 4 QStackedLayout dan QComboBox untuk Window Layering

Belajar Menggunakan KDE Edisi 3 Mengenal Menu dan Taskbar

Wujud Program yang Diinginkan

Belajar Menggunakan KDE Edisi 1 Perkenalan Singkat KDE

Koneksi Jaringan Host-Guest Ubuntu-Mint di Virtualbox untuk PING dan Wireshark

Perkenalan Pemrograman GUI di Linux dengan Qt Framework dan Bahasa C++ Ade Malsasa Akbar

Qt Creator. INF-103 Pemrograman II Program Studi Informatika. Dr. Taufik Fuadi Abidin, M.Tech Irvanizam Zamanhuri, M.Sc

VI. FUNGSI. Fungsi Main ( ) Fungsi a ( ) Fungsi b ( ) Fungsi c ( ) Fungsi c1 ( ) Fungsi c2 ( ) Fungsi c3 ( ) Bentuk umumnya :

Gambar 1. Tampilan Layar Sebuah Program Animasi

Mari Belajar Gimp. versi 2.8 Bagian 2 : Mengenal Toolbox. Oleh: Wahyu Setiyono

Tutorial Instalasi Wordpress dengan XAMPP di Ubuntu Maverick

Tutorial L A TEX di Linux (Disertai Contoh)

MINGGU IV : PEMROGRAMAN BERORIENTASI OBJEK

PENDAHULUAN. Gambar 1.1. GameMaker dari YoyoGames

BAB 3 User Interface. 3.1 Sekilas Tentang Blender

2. Setelah macro diaktifkan, buka file Print Alamat.XLSM. Hasilnya seperti tampilan Gbr. 1 berikut ini.

Kurikulum Qt. Chapter 5 Pointer dan References. Agenda. Apa itu Pointer? Memory Komputer. Mengambil Alamat Memory dari Variabel

Kurikulum Qt. { Basic OOP } Chapter 4. Function

DAFTAR ISI PANDUAN PENGGUNAAN WEB SEKOLAH

Mari Belajar Gimp. versi 2.8 Bagian 2 : Mengenal Toolbox. Oleh: Wahyu Setiyono

Kurikulum Qt. Chapter 4 Function. Fungsi

Aplikasi Web Dinamis Lanjut

Aplikasi ideb Viewer Sistem Layanan Informasi Keuangan (SLIK)

MODUL IV PROCEDURE. [Private public static]sub namaprosedur (daftarargumen) End Sub

Pemrograman Aplikasi GUI dengan Framework Qt (5.0.1) Penulis: Zulhaj Aliyansyah

PETUNJUK SINGKAT INSTALASI DAN PENGGUNAAN IGN 2009

Pointer dan Referensi

visit :

Cara Membaca File Text di JAVA

MENGGESER, MEMUTAR, DAN MENYEKALAKAN MOLEKUL

Daftar Isi. 2 P a g e

Kurikulum Qt. Chapter 8 - Polymorphism. Polimorfisme. Problema Pewarisan Tunggal (Single Inheritance)

MEMBUAT SLIDE PRESENTASI DENGAN AURORA 3D PRESENTATION 1

Sekilas C DAN C++ DISUSUN OLEH. Sebuah bahasa, yaitu: 1. Bahasaa tingkat tinggi. High. dapat. lunak

TUTORIAL DASAR C++ BELAJAR C++ DARI NOL. Nor Kandir. Lab B201 - Teknik Elektro ITS Surabaya

Fungsi 2. Ekohariadi FT Unesa

yang mendukung untuk mengakses website perangkat ajar Algorithfun. menggunakan perangkat ajar Algorthfun Cara Menggunakan Algorithfun

TUGAS 1 APLIKASI WEB DINAMIS LANJUT MENGENAL COMPOSER DAN GITHUB DISUSUN OLEH: AHMAD DAHLAN AL-ASY ARI( )

KEMENTERIAN KEHUTANAN DIREKTORAT JENDERAL PLANOLOGI KEHUTANAN BUKU PETUNJUK PENGGUNAAN APLIKASI WEBGIS KEMENTERIAN KEHUTANAN

Dasar Pemrograman. Visual Studio Program C++ Sederhana. Yoannita, S.Kom.

Pada saat aplikasi ini dijalankan, maka yang pertama akan. ditampilkan adalah bagian loading sebelum masuk ke bagian

TUGAS 1 WEB DINAMIS LANJUT. Nama : Parisaktiana Fathonah NIM : Link :

Scope Variable. Sebuah variabel di dalam sebuah fungsi memiliki jangkauan tertentu. Skop variabel terdiri dari:

EXCEL PAGE LAYOUT. Copyright Asep Herman Suyanto

Abstrak. Pendahuluan. cerita. Pemrograman. mewakili semua. Struktur Bahasa. dan deklarasi. Mari. ilmuti.org Seluruh disertakan dalam

Deskripsi Proyek. Yang paling penting 1. Keamanan 2. Dapat digunakan pada Android Stabilitas 4. Tampilan elegan tapi simpel

Pendahuluan. Baiklah, mari kita memulainya.! Sebagai informasi, saya menggunakan program FileZilla versi hansipudin

Blender Game Engine Menggunakan Tekstur Font Step by step menerapkan tekstur font pada Blender Game Engine. panduaji.net creative commons

MODUL 10 Fungsi 10.1 Kompetensi 10.2 Alat Dan Bahan: 10.3 Ulasan Teori: Dasar Fungsi Deklarasi Fungsi

Bekasi, Desember 2006

BAB 11 MENAMBAHKAN SLIDE SHOW

User interface & XML Layout

IF PEMROGRAMAN LANJUT EVENT. Oleh : Andri Heryandi, M.T.

Dasar Pemrograman Java

KEMENTERIAN KEHUTANAN DIREKTORAT JENDERAL PLANOLOGI KEHUTANAN BUKU PETUNJUK PENGGUNAAN APLIKASI WEBGIS KEMENTERIAN KEHUTANAN

PANDUAN PENGGUNAAN PERSONAL WEB BLOG. Version 0.1

Membuat Menu Login Sederhana [Full Coding]

Membuat Model SEM dengan AMOS

KONFIGURASI 3D STUDIO MAX 2010 & SLATE MATERIAL

Pemodelan Objek Pena Cantik 3D

1. Modifier Digunakan untuk memberikan batasan atau penanda bagaimana kelas lain menggunakan attribut, constructor dan method dari suatu kelas.

Class & Object 2. Imam Fahrur Rozi

BAB VIII CLASS ABSTRACT & CLASS INTERFACE. //abstract class bisa, kelas biasa bisa System.out.println("Ini nama");

BAB V IMPLEMENTASI DAN PEMBAHASAN. pada SMA Negeri 15 Surabaya. Penjelasan yang diberikan yaitu mengenai

Mengintegrasikan Report Builder ke Dalam Aplikasi Oracle EBS

Desain Photoshop dibuat menggunakan Layer / Lapisan transparan yang disatukan membentuk suatu Objek gambar yang baru.

Fungsi 1. Ekohariadi FT Unesa

FAKULTAS TEKNIK UNIVERSITAS NEGERI YOGYAKARTA LAB SHEET PRAKTIK MEDIA DIGITAL

Panduan sederhana mengoperasikan dokumen Microsoft word kedalam adobe acrobat professional

BAB 4 SPRITE. Contoh sebuah Sprite

Sebagai contoh misalnya akan dibuat kelas turunan Silinder dari kelas dasar Lingkaran, maka dapat dituliskan :

Workshop Singkat Membuat Game Shooter

Dwiny Meidelfi, M.Cs

BAB 8 Argumen dari Command-line

KEMENTERIAN KEHUTANAN DIREKTORAT JENDERAL PLANOLOGI KEHUTANAN BUKU PETUNJUK PENGGUNAAN APLIKASI WEBGIS KEMENTERIAN KEHUTANAN

MODUL 2 LANGKAH DETAIL PRAKTIKUM

KUESIONER PENELITIAN (untuk Guru) 3. Apakah alat peraga dibutuhkan untuk membantu mengajar geometri?

Otodidak Behind The Scene

Mengenal VLookup lewat Pembuatan Tabel Sederhana

Pertanyaan yang sering muncul di benak orang-orang yang ingin membuat website (mungkin Jamaah IKMI juga termasuk) adalah: harus mulai dari mana?

Aplikasi Pengolah Angka I. SPI112 - Slide 5 1

Pemrograman dengan Java

BAB IV IMPLEMENTASI DAN UJI COBA

Inheritance dan Polimorfisme

Prosedur Menjalankan Aplikasi Linda

Tips dan Trik GIMP (GNU Image Manipulation Program)

MODUL 4: USER INTERFACE

MANUAL BLOG STAFF.UNS.AC.ID

Transkripsi:

Pemrograman Qt 17 Pan, Scroll, Zoom, Flip, dan Rotate untuk QGraphicsView Bismillahirrahmanirrahim. Tulisan ini adalah kelanjutan dari tutorial sebelumnya dalam hal QGraphicsScene dan QGraphicsView. Kita akan membuat sebuah image viewer yang mampu melakukan pan, scroll, zoom in, zoom out, flip, dan rotate. Anda dapat mengunduh kode sumber program berupa proyek Qt Creator di bagian akhir tulisan. Semoga tulisan ini bermanfaat. Spesifikasi Sistem Ubuntu 12.04 Qt Creator 2.4.1 Qt 4.8 Daftar Kelas 1. QGraphicsScene 2. QGraphicsView 3. QToolButton 4. QVBoxLayout 5. QHBoxLayout 6. QWidget Daftar Method 1. setscenerect() -> milik QGraphicsScene 2. addpixmap() -> milik QGraphicsScene 3. setscene() -> milik QGraphicsView 4. setdragmode() -> milik QGraphicsView 5. scale() -> milik QGraphicsView 6. rotate() -> milik QGraphicsView 7. resettransform() -> milik QGraphicsView 8. zoomin() -> buatan sendiri 9. zoomout() -> buatan sendiri 10. reset() -> buatan sendiri 11. rotate() -> buatan sendiri 12. flip() -> buatan sendiri

Arah Tulisan Ini

Kode mainwindow.h #ifndef MAINWINDOW_H #define MAINWINDOW_H //#include #include namespace Ui class MainWindow; //extern int pengubah_angka = 0; class MainWindow : public QMainWindow Q_OBJECT public: explicit MainWindow(QWidget *parent = 0); ~MainWindow(); QToolButton *tombol_kde; QToolButton *tombol_gnome; QToolButton *tombol_xfce; QToolButton *tombol_lxde; QToolButton *tombol_unity; QGraphicsScene *objek_qgs; QGraphicsView *objek_qgv; QVBoxLayout QHBoxLayout QVBoxLayout QVBoxLayout QWidget QWidget QWidget QPixmap *layout_utama; *layout_isi_global; *layout_kiri_gambar; *layout_kanan_tombol; *fondasi; *panel_kiri; *panel_kanan; *pixmap; // double scalefactor; public slots: void void void void void void zoomin(); zoomout(); flip_horizontal(); flip_vertikal(); rotate(); reset(); private:

; Ui::MainWindow *ui; #endif // MAINWINDOW_H

mainwindow.cpp #include "mainwindow.h" #include "ui_mainwindow.h" MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) QToolButton *tombol_zoomin QToolButton *tombol_zoomout QToolButton *tombol_rotate QToolButton *tombol_reset QToolButton *tombol_flip_horizontal QToolButton *tombol_flip_vertikal = new QToolButton; = new QToolButton; = new QToolButton; = new QToolButton; = new QToolButton; = new QToolButton; objek_qgs = new QGraphicsScene; objek_qgv = new QGraphicsView; //inilah QGV yang dipangkas yang dimaksud di komentar fungsi-fungsi di bawah QHBoxLayout *layout_utama = new QHBoxLayout; QVBoxLayout *layout_kiri_gambar = new QVBoxLayout; QVBoxLayout *layout_kanan_tombol = new QVBoxLayout; QWidget *fondasi = new QWidget; //deklarasi objek di CPP harus normal QWidget *panel_kanan = new QWidget; //sama sekali tidak boleh diringkas QWidget *panel_kiri = new QWidget; //atau, segmentation fault pixmap = new QPixmap(":/gambar/ubuntu"); supaya bisa dipakai di fungsi luar buatan sendiri pixmap dipanggil di suatu fungsi sebagai dipanggil dengan didahului * //deklarasi terpotong //dan nanti kalau objek //parameter, maka //coba mengisi layout dengan QGV dan tombol layout_kanan_tombol->addwidget(tombol_zoomin); //sisi kanan layout_kanan_tombol->addwidget(tombol_zoomout); layout_kanan_tombol->addwidget(tombol_rotate); layout_kanan_tombol->addwidget(tombol_reset); layout_kanan_tombol->addwidget(tombol_flip_horizontal); layout_kanan_tombol->addwidget(tombol_flip_vertikal); layout_kiri_gambar->addwidget(objek_qgv); //sisi kiri //sekarang coba atur ukuran minimal para tombol tombol_zoomin->setminimumsize(140,55); tombol_zoomout->setminimumsize(140,55); tombol_rotate->setminimumsize(140,55); tombol_reset->setminimumsize(140,55);

tombol_flip_horizontal->setminimumsize(140,55); tombol_flip_vertikal->setminimumsize(140,55); //sekarang coba beri nama untuk para tombol tombol_zoomin->settext("zoom IN"); tombol_zoomout->settext("zoom OUT"); tombol_rotate->settext("rotate"); tombol_reset->settext("reset"); tombol_flip_horizontal->settext("flip HORIZONTALLY"); tombol_flip_vertikal->settext("flip VERTICALLY"); //coba memasang layout ke widget panel_kiri->setlayout(layout_kiri_gambar); panel_kanan->setlayout(layout_kanan_tombol); //coba membangun semua layout dulu sekaligus lalu diletakkan objek-objek pada tempatnya sesudahnya layout_utama->addwidget(panel_kiri); //widget panel kiri layout_utama->addwidget(panel_kanan); //widget panel kanan //tunggu, kita harus mengurus QGraphics* dulu objek_qgs->addpixmap(*pixmap); //kalau suatu objek dideklarasikan dengan cara terpotong seperti baris 25 di atas //maka bentuk pemanggilan objek di dalam parameter harus diawali dengan * Jumaada al-awal 17, 1435 12:55 PM diakhiri dengan & atau * //ditemukan pada Yaum al-arbi'a, //Wednesday, March 19, 2014 //tidak diawali dengan &, tidak objek_qgs->setscenerect(qrectf(0,0,1,1)); //akhirnya setelah berjam-jam ketemu juga //sumber: http://www.qtcentre.org/threads/22372-qgraphicsscene-scrollbar-resizing //ditemukan pada Yaum al-khamees, Rabi` al-thaani 19, 1435 11:06 PM / Thursday, February 20, 2014 //gunanya baris ini untuk memaksa sisi kiri gambar tepat sisi kiri QGV, alias //supaya semua scrollbar selalu berada pada posisi paling awal / default //jika tidak begini, semua scrollbar selalu berada pada akhir posisinya //scrollbar nakal jika ukuran resolusi gambar melampaui ukuran QGV objek_qgv->setscene(objek_qgs); objek_qgv->setinteractive(true); objek_qgs->setscenerect(0,0,pixmap->width(),pixmap->height()); //get image size macam ini saya peroleh dari stackoverflow tapi lupa alamatnya //ini harus ada setelah QRectF di atas objek_qgv->setdragmode(qgraphicsview::scrollhanddrag);

objek_qgv->show(); //waktunya merender fondasi fondasi->setlayout(layout_utama); this->setcentralwidget(fondasi); //waktunya mainkan tombol untuk fungsi zoom Yaum al-khamees, Rabi` al-thaani 19, 1435 11:27 PM connect(tombol_zoomin, SIGNAL(clicked()), this, SLOT(zoomin())); connect(tombol_zoomout, SIGNAL(clicked()), this, SLOT(zoomout())); connect(tombol_reset, SIGNAL(clicked()), this, SLOT(reset())); connect(tombol_rotate, SIGNAL(clicked()), this, SLOT(rotate())); connect(tombol_flip_horizontal, SIGNAL(clicked()), this, SLOT(flip_horizontal())); connect(tombol_flip_vertikal, SIGNAL(clicked()), this, SLOT(flip_vertikal())); MainWindow::~MainWindow() delete ui; void MainWindow::zoomin() double scalefactor = 1.25; //kalau mau jalankan fungsi yang menembak langsung objek di dalam kelas utama, //maka deklarasi objek kelas yang ditembak harus dipangkas //lihat deklarasi QGV di atas //diingat kembali pada Yaum al-ahad, Rabi` al-thaani 22, 1435 01:13 PM dari Pemrograman Qt 5 // this->objek_qgv->scale(scalefactor,scalefactor); // QTransform flip; this->objek_qgv->scale(scalefactor, scalefactor); void MainWindow::zoomout() //kalau mau jalankan fungsi yang menembak langsung objek di dalam kelas utama, //maka deklarasi objek kelas yang ditembak harus dipangkas //lihat deklarasi QGV di atas //diingat kembali pada Yaum al-ahad, Rabi` al-thaani 22, 1435 01:13 PM dari Pemrograman Qt 5 double scalefactor = 1.3; //istimewa pada Yaum al-ahad, Rabi` al-thaani 22, 1435 01:33 PM //didapatkan dari //http://www.qtcentre.org/wiki/index.php? title=qgraphicsview:_smooth_panning_and_zooming this->objek_qgv->scale(1.0/scalefactor,1.0/scalefactor); void MainWindow::rotate()

//kalau mau jalankan fungsi yang menembak langsung objek di dalam kelas utama, //maka deklarasi objek kelas yang ditembak harus dipangkas //lihat deklarasi QGV di atas //diingat kembali pada Yaum al-ahad, Rabi` al-thaani 22, 1435 01:13 PM dari Pemrograman Qt 5 this->objek_qgv->rotate(45); void MainWindow::reset() //kalau mau jalankan fungsi yang menembak langsung objek di dalam kelas utama, //maka deklarasi objek kelas yang ditembak harus dipangkas //lihat deklarasi QGV di atas //diingat kembali pada Yaum al-ahad, Rabi` al-thaani 22, 1435 01:13 PM dari Pemrograman Qt 5 this->objek_qgv->resettransform(); //fungsi di bawah ini diambil dari kode pada kelas utama //gunanya untuk memaksa pucuk kiri atas gambar untuk berada di pucuk kiri atas juga dari QGV //ditemukan pada Yaum al-arbi'a, Jumaada al-awal 17, 1435 01:02 PM //Wednesday, March 19, 2014 this->objek_qgs->setscenerect(qrectf(0,0,1,1)); this->objek_qgs->setscenerect(0,0,pixmap->width(),pixmap->height()); void MainWindow::flip_horizontal() /* QTransform gambar_berubah; //teknik ini didapat pada Saturday, March 29, 2014 dari https://qtproject.org/forums/viewthread/13780/ QTransform gambar_berubah_lagi = gambar_berubah.translate(- 1,1); //khusus baris ini, ditemukan sendiri dengan coba-coba //memberanikan diri memakai selain method scale() //ternyata justru translate() yang mampu membolakbalikkan gambar otomatis setiap dipanggilnya fungsi, //tidak seperti scale() yang mengubah gambar 1 kali saja walau dipanggil berulang kali //ditemukan pada Saturday, March 29, 2014 01:00 PM //namun kelemahan kode masih terjadi, sama seperti sebelum branching yakni membalik gambar hanya dari dalam bingkai pixmap BUKANNYA dari dalam QGV //padahal yang diinginkan pembalikan seperti Flip pada GIMP, yakni mutlak dibalik di dalam bingkai QGV (yang terluar) QPixmap *pixmap_kedua = new QPixmap(pixmap- >transformed(gambar_berubah_lagi)); this->objek_qgs->addpixmap(*pixmap_kedua);*/ //pada akhirnya solusi di atas harus dianulir dengan satu baris sederhana ini //Saturday, March 29, 2014 01:12 PM this->objek_qgv->scale(-1,1);

//fungsi ini baru ditambahkan pada Wednesday, April 02, 2014 01:52 PM void MainWindow::flip_vertikal() this->objek_qgv->scale(1,-1);

Qt Creator dan Kode

Hasil Pan (gambar bisa di-drag)

Zoom In Zoom Out

Rotate (Clockwise) Reset

Flip Horizontally Flip Vertically

Analisis mainwindow.h Di header ini, tidak banyak yang harus diperhatikan. Jika Anda belum memahami penulisan header di Qt, silakan merujuk ke tulisan ini. mainwindow.cpp Pada berkas ini, ada banyak yang harus diperhatikan. Berikut ini saya daftarkan yang penting-penting. 1. Pembuatan objek QGraphicsScene dan QGraphicsView. 2. connect() antara QToolButton dengan fungsinya masing-masing. 3. Fungsi untuk pan. 4. Fungsi zoomin(). 5. Fungsi zoomout(). 6. Fungsi rotate(). 7. Fungsi reset(). 8. Fungsi flip_horizontal(). 9. Fungsi flip_vertikal(). Saya akan menjelaskannya satu per satu sebagai berikut. QGraphicsScene dan QGraphicsView objek_qgs = new QGraphicsScene; objek_qgv = new QGraphicsView; //inilah QGV yang dipangkas yang dimaksud di komentar fungsi-fungsi di bawah Dua baris di atas adalah pembuatan objek (inisialisasi) QGraphicsScene dan QGraphicsView. Model inisialisasinya terpangkas (di bagian awalnya tidak ada nama kelas, hanya ada di bagian akhir) karena dua objek ini akan digunakan di fungsi lain di luar fungsi utama MainWindow. objek_qgs->addpixmap(*pixmap); //kalau suatu objek dideklarasikan dengan cara terpotong seperti baris 25 di atas //maka bentuk pemanggilan objek di dalam parameter harus diawali dengan * Jumaada al-awal 17, 1435 12:55 PM diakhiri dengan & atau * //ditemukan pada Yaum al-arbi'a, //Wednesday, March 19, 2014 //tidak diawali dengan &, tidak objek_qgs->setscenerect(qrectf(0,0,1,1)); //akhirnya setelah berjam-jam ketemu juga

//sumber: http://www.qtcentre.org/threads/22372-qgraphicsscene-scrollbar-resizing //ditemukan pada Yaum al-khamees, Rabi` al-thaani 19, 1435 11:06 PM / Thursday, February 20, 2014 //gunanya baris ini untuk memaksa sisi kiri gambar tepat sisi kiri QGV, alias //supaya semua scrollbar selalu berada pada posisi paling awal / default //jika tidak begini, semua scrollbar selalu berada pada akhir posisinya //scrollbar nakal jika ukuran resolusi gambar melampaui ukuran QGV objek_qgv->setscene(objek_qgs); objek_qgs->setscenerect(0,0,pixmap->width(),pixmap->height()); //get image size macam ini saya peroleh dari stackoverflow tapi lupa alamatnya //ini harus ada setelah QRectF di atas objek_qgv->setdragmode(qgraphicsview::scrollhanddrag); Kode di atas ini adalah persiapan untuk menayangkan gambar pada QGraphicsView (selanjutnya disebut QGV). Seperti yang telah dijelaskan kemarin, penayangan gambar di sini memerlukan persiapan QPixmap, kemudian QGraphicsScene (selanjutnya disebut QGS), baru kemudian QGV. Fungsi addpixmap untuk objek_qgs di sini diisi dengan argumen berupa objek pixmap yang berupa ponter (ada tanda *). Tentunya objek pixmap harus diisi gambar dulu sebelumnya. Jika belum mengerti cara memasukkan gambar, silakan merujuk kemari. Ada hal penting yang harus diperhatikan mengenai posisi gambar dan scrollbar di dalam QGV. Anda harus memasang kode ini: objek_qgs->setscenerect(qrectf(0,0,1,1)); dan ini: objek_qgs->setscenerect(0,0,pixmap->width(),pixmap->height()); Kode pertama gunanya untuk memaksa semua scrollbar berada pada posisinya paling awal. Inilah kondisi normal yang tidak akan tercapat jika tidak menggunakan kode pertama. Berikut ini gambar kesalahannya:

Lalu jika tidak menggunakan kode kedua, maka posisi gambar yang akan meleset jauh dari posisi normal (pojok kiri atas gambar tepat pada pojok kiri atas QGV). Kode kedua adalah pengatur untuk itu. Berikut ini gambar kesalahannya:

Jika kedua kode dipakai dengan benar, maka hasilnya normal seperti bagian awal tulisan ini. Berikut gambarnya.

Kode untuk Pan Pan itu adalah kemampuan objek untuk berpindah jika dikenai drag oleh mouse. Ini bisa dilakukan dengan memanfaatkan fungsi setdragmode() milik QGV sebagai berikut. objek_qgv->setdragmode(qgraphicsview::scrollhanddrag); Perhatikan bahwa argumen QGraphicsView::ScrollHandDrag yang mengatur pan ini. connect() Fungsi connect() adalah bagian yang sangat penting dari Qt Framework. Fungsi ini bertugas menghubungkan antara SIGNAL dan SLOT, dua komponen vital dari Qt Framework. Dalam program ini, yang dihubungkan adalah tombol-tombol (QToolButton) ketika diklik dengan fungsi-fungsi yang sudah dipersiapkan sebelumnya. Fungsi connect() selalu ada setiap ada hubungan SIGNAL dan SLOT. Sedangkan SIGNAL dan SLOT ada setiap kita menginginkan event tertentu berlaku jika ada suatu klik/pemicu lain. SIGNAL dan SLOT di Qt Framework itu mudah dipahami. Berikut ini kodenya. connect(tombol_zoomin, SIGNAL(clicked()), this, SLOT(zoomin())); connect(tombol_zoomout, SIGNAL(clicked()), this, SLOT(zoomout())); connect(tombol_reset, SIGNAL(clicked()), this, SLOT(reset())); connect(tombol_rotate, SIGNAL(clicked()), this, SLOT(rotate())); connect(tombol_flip_horizontal, SIGNAL(clicked()), this, SLOT(flip_horizontal())); connect(tombol_flip_vertikal, SIGNAL(clicked()), this, SLOT(flip_vertikal()));

Fungsi-Fungsi Bagian paling menarik dari program ini untuk dibahas adalah fungsi-fungsinya. Ada 6 fungsi. Saya akan bahas sebagai berikut. 1. Zoom In void MainWindow::zoomin() double scalefactor = 1.25; //kalau mau jalankan fungsi yang menembak langsung objek di dalam kelas utama, //maka deklarasi objek kelas yang ditembak harus dipangkas //lihat deklarasi QGV di atas //diingat kembali pada Yaum al-ahad, Rabi` al-thaani 22, 1435 01:13 PM dari Pemrograman Qt 5 // this->objek_qgv->scale(scalefactor,scalefactor); // QTransform flip; this->objek_qgv->scale(scalefactor, scalefactor); Perlu diperhatikan bahwa seluruh transformasi di dalam program ini dilakukan oleh fungsifungsi milik QGV itu sendiri. Untuk melakukan zoom in (perbesar ke dalam), kita cukup memanggil fungsi scale() dengan 2 argumennya yakni x dan y. Di sini saya memakai variabel bertipe double dengan ukuran 1.25. Tujuannya supaya sama besar antara perbesaran positif (zoom in) dan perbesaran negatif (zoom out) sebagaimana ditemukan di program pengolah gambar. 2. Zoom Out void MainWindow::zoomout() //kalau mau jalankan fungsi yang menembak langsung objek di dalam kelas utama, //maka deklarasi objek kelas yang ditembak harus dipangkas //lihat deklarasi QGV di atas //diingat kembali pada Yaum al-ahad, Rabi` al-thaani 22, 1435 01:13 PM dari Pemrograman Qt 5 double scalefactor = 1.25; //istimewa pada Yaum al-ahad, Rabi` al-thaani 22, 1435 01:33 PM //didapatkan dari //http://www.qtcentre.org/wiki/index.php? title=qgraphicsview:_smooth_panning_and_zooming this->objek_qgv->scale(1.0/scalefactor,1.0/scalefactor); Zoom out adalah kebalikan zoom in. Jika di zoom in kita pakai argumen scalefactor begitu saja (alias 1.0*scaleFactor), maka di zoom out ini kita balik menjadi 1.0/scaleFactor agar gambarnya mengecil. Dengan zoom out, kita tahu bahwa perlu adanya suatu nilai pasti yang

menjadi satuan baku perbesaran. Bahasa kasarnya, Anda klik ZOOM IN 2 kali maka gambar membesar, klik ZOOM OUT 2 kali juga maka gambar kembali seperti semula. 3. Rotate void MainWindow::rotate() //kalau mau jalankan fungsi yang menembak langsung objek di dalam kelas utama, //maka deklarasi objek kelas yang ditembak harus dipangkas //lihat deklarasi QGV di atas //diingat kembali pada Yaum al-ahad, Rabi` al-thaani 22, 1435 01:13 PM dari Pemrograman Qt 5 this->objek_qgv->rotate(45); Perputaran di sini saya atur 45 derajat searah jarum jam (positif). Ini sama juga dengan sebelumnya, hanya menggunakan fungsi bawaan QGV. 4. Reset void MainWindow::reset() //kalau mau jalankan fungsi yang menembak langsung objek di dalam kelas utama, //maka deklarasi objek kelas yang ditembak harus dipangkas //lihat deklarasi QGV di atas //diingat kembali pada Yaum al-ahad, Rabi` al-thaani 22, 1435 01:13 PM dari Pemrograman Qt 5 this->objek_qgv->resettransform(); //fungsi di bawah ini diambil dari kode pada kelas utama //gunanya untuk memaksa pucuk kiri atas gambar untuk berada di pucuk kiri atas juga dari QGV //ditemukan pada Yaum al-arbi'a, Jumaada al-awal 17, 1435 01:02 PM //Wednesday, March 19, 2014 this->objek_qgs->setscenerect(qrectf(0,0,1,1)); this->objek_qgs->setscenerect(0,0,pixmap->width(),pixmap->height()); Fungsi reset ini maksudnya mengembalikan gambar seperti semula setelah banyak diubah ini dan itu. Sederhana saja, cukup memanggil fungsi resettransform milik QGV. Lalu memanggil ulang rekonstruksi QGS (yang dua baris itu). 5. Flip Horizontally void MainWindow::flip_horizontal() /* QTransform gambar_berubah;

//teknik ini didapat pada Saturday, March 29, 2014 dari https://qtproject.org/forums/viewthread/13780/ QTransform gambar_berubah_lagi = gambar_berubah.translate(- 1,1); //khusus baris ini, ditemukan sendiri dengan coba-coba //memberanikan diri memakai selain method scale() //ternyata justru translate() yang mampu membolakbalikkan gambar otomatis setiap dipanggilnya fungsi, //tidak seperti scale() yang mengubah gambar 1 kali saja walau dipanggil berulang kali //ditemukan pada Saturday, March 29, 2014 01:00 PM //namun kelemahan kode masih terjadi, sama seperti sebelum branching yakni membalik gambar hanya dari dalam bingkai pixmap BUKANNYA dari dalam QGV //padahal yang diinginkan pembalikan seperti Flip pada GIMP, yakni mutlak dibalik di dalam bingkai QGV (yang terluar) QPixmap *pixmap_kedua = new QPixmap(pixmap- >transformed(gambar_berubah_lagi)); this->objek_qgs->addpixmap(*pixmap_kedua);*/ //pada akhirnya solusi di atas harus dianulir dengan satu baris sederhana ini //Saturday, March 29, 2014 01:12 PM this->objek_qgv->scale(-1,1); Pembalikan gambar (translasi/mirror) ini sebenarnya memusingkan untuk saya yang tidak tahu soal QGV. Setelah melakukan pencarian, berpusing ria, tambal sulam kode, saya akhirnya menggunakan kembali fungsi scale() milik QGV. Hanya saja, di sini nilai argumennya -1 dan 1. Ini akan membuat yang kanan menjadi yang kiri pada gambar. Kelemahan: jika sebelumnya gambar sudah di-rotate, maka yang dibalik adalah gambar di dalam bingkai pixmap saja, tidak dibalik secara mutlak. Ini akan berbeda dengan aplikasi pengolah gambar biasanya. Saya belum menemukan solusinya. 6. Flip Vertically void MainWindow::flip_vertikal() this->objek_qgv->scale(1,-1); Sama dengan yang horizontal, hanya memakai fungsi scale() tetapi dengan nilai argumen 1 dan -1. Ini akan membuat yang atas menjadi yang bawah. Kelemahannya juga sama dengan yang horizontal.

Kesimpulan 1. Penayangan gambar di Qt Framework bisa dilakukan dengan QPixmap, QGraphicsScene, dan QGraphicsView. 2. Manipulasi gambar sederhana dengan QGV cukup dilakukan dengan method-method milik QGV itu sendiri. Unduh Kode Sumber Program kali ini bernama WajahDepan. Silakan unduh kode sumber berikut dan bukalah di Qt Creator Anda. Semoga bermanfaat. Alamat: http://otodidak.freeserver.me/tarball/wajahdestop.tar.gz Ukuran: 500 KB Penutup Walau sudah puas sekali, saya masih menyisakan satu misteri mengenai flip pada QGV. Semoga tulisan ini bermanfaat Referensi http://www.qtcentre.org/wiki/index.php? title=qgraphicsview:_smooth_panning_and_zooming https://qt-project.org/forums/viewthread/13780/ 12. Tentang Dokumen Ini Dokumen ini adalah versi PDF dari posting asli http://malsasa.wordpress.com/2014/04/04/pemrograman-qt-17-pan-scroll-zoom-flip-danrotate-untuk-qgraphicsview/. Dokumen ini ditulis dengan fonta Ubuntu 12pt. Dokumen ini disusun ulang dengan Libreoffice Writer 3.5. Dokumen ini selesai disusun pada 4 Maret 2014. Penulis mohon maaf jika terdapat kesalahan dalam dokumen ini. 13. Tentang Penulis Penulis adalah warga Forum Ubuntu Indonesia. Penulis mendukung pendidikan perangkat lunak legal (terutama FOSS) untuk masyarakat. Penulis menyediakan buku-buku panduan Linux untuk pemula maupun ahli untuk diunduh secara gratis 1. Penulis bisa dihubungi via SMS di nomor 0896 7923 7257. 1 http://malsasa.wordpress.com/pdf