#JuliNgeblog Der zweite Tag : Delegate Mouse Event Signal on QLabel

Selamat datang kembali!

Tulisan hari kedua sudah mulai masuk ke topik yang teknis. Persoalannya adalah ketika mau menangkap sinyal tetikus (press, release, move) untuk menggambar. Ketika menggunakan delphi dulu, prosedur untuk menangani event tetikus bisa dibuat terpisah dari komponen yang menjadi tempat terjadinya event. Misalnya, ketika ada event mouse di atas komponen Image, maka prosedur penanganannya bisa dibuat sebagai method dari objek Form. Salah satu contoh skenarionya adalah ketika terjadi sesuatu di komponen ini, maka akan disimpan perintah menggambar dan proses penggambaran di komponen yang bisa menggambar bisa didekorasi dengan penunjuk objek apa yang akan digambar tanpa mengganggu kondisi yang sudah ada (misal. rubberband).

dip

Masalah muncul ketika mau menerapkan cara serupa pada konteks Qt di python (PyQt atau PySide). Pada konteks ini, kelas yang memiliki buffer untuk menggambar ada di QImage. Agar gambar di objek ini dapat ditampilkan, Objek QImage perlu dipasang di Objek QLabel. Penanganan event mouse dilakukan di QLabel. Pendekatan untuk menangani proses semacam ini adalah dengan membuat kelas turunan QLabel atau QWidget untuk kebutuhan yang berbeda yang tentu saja merepotkan. Saya perlu satu komponen kecil yang bisa dipakai untuk beberapa konteks penggambaran yang berbeda tapi memiliki mekanisme yang sama (prosedur penanganan ada di objek lain).

Setelah membaca manual, ternyata membuat sinyal event cukup mudah:

  1. deklarasikan objek sinyal internal
  2. lempar sinyal sesuai dengan keadaan yang diinginkan (dalam hal ini, setiap terjadi mouse event)

Penjelasan lebih lanjut dapat dilihat di kode berikut :

class QMLabel(QtGui.QLabel):
	mousePressed = QtCore.Signal(QtGui.QMouseEvent)
	mouseMove = QtCore.Signal(QtGui.QMouseEvent)
	mouseReleased = QtCore.Signal(QtGui.QMouseEvent)

	def __init__(self, parent):
		super(QMLabel, self).__init__(parent)
		self.setMouseTracking(True)

	def mousePressEvent(self, event):
		self.mousePressed.emit(event)
		super(QMLabel, self).mousePressEvent(event)

	def mouseMoveEvent(self, event):
		self.mouseMove.emit(event)
		super(QMLabel, self).mouseMoveEvent(event)

	def mouseReleaseEvent(self, event):
		self.mouseReleased.emit(event)
		super(QMLabel, self).mouseReleaseEvent(event)

Di kode tersebut, saya membuat tiga event yang akan dilempar (didelegasikan). Pada setiap kode penangan event, saya lempar sinyal internal (prosedur emit).

Cara menggunakan kelas ini sama seperti ketika menggunakan komponen lain. rinciannya bisa dilihat di kode berikut :

class PickWidget(QtGui.QWidget):
	postAction = QtCore.Signal()
	def __init__(self, parent):
		super(PickWidget, self).__init__(parent)

		#offline buffer
		self.trackimage = QtGui.QImage(660, height, QtGui.QImage.Format_RGB32)

		self.tracklabel = QMLabel(self)
		self.tracklabel.setPixmap(QtGui.QPixmap.fromImage(self.trackimage))
		self.tracklabel.adjustSize()

		self.tracklabel.mousePressed.connect(self.mousepress)
		self.tracklabel.mouseReleased.connect(self.mouserelease)
		self.tracklabel.mouseMove.connect(self.mousemove)

	def mousepress(self, event):
		pass

	def mouserelease(self, event):
		pass

	def mousemove(self, event):
		pass

Sekian dulu catatan kali ini. Mudah-mudahan bermanfaat bagi saya sendiri kalau sewaktu-waktu lupa atau untuk anda kalau bertemu dengan persoalan yang sama.

Wassalam,

Iklan

#JuliNgeblog Der Erste Tag

Hari ini secara tidak sengaja saya melihat twit dari omari dan petra tentang tantangan menulis blog setiap hari di bulan Juli. Setelah melihat arsip blog ini, ternyata tulisan terakhir dibuat di tahun 2014. Sudah lebih dari satu tahun blog ini tidak terbarukan. Saya pikir ini momen yang baik untuk kembali memakmurkan blog ini dengan tulisan-tulisan yang mungkin diwarnai kode program, opini dengan argumen yang masih mentah, galauan mahasiswa doktor yang sudah masuk tahun ke-empat, atau sekadar selentingan acak.

Sebagai pengantar, saya akan menceritakan kondisi saya saat ini. Saya masih tinggal di Wina, Austria. Alhamdulillah, sejak Oktober tahun lalu anak dan istri sudah ikut menemani. Beasiswa DIKTI sudah terhenti sejak awal tahun, dan karena satu dan lain hal saya tidak sempat mendaftarkan perpanjangan beasiswa untuk semester ini (Sommer). Saya akan coba mengajukan lagi perpanjangan beasiswa semester musim dingin. Kabar terbaru yang saya terima, dua paper di lab kami di sini belum berhasil masuk jalur riset dan jalur resource di ISWC 2016. Kemungkinan akan dialihkan untuk dipublikasi di jalur workshop pada acara yang sama.

Saya cukupkan dulu tulisan ini mudah-mudahan jadi awal yang baik. Sampai jumpa di tulisan berikutnya (besok)! kalau hampir terlewat, mohon diingatkan 😀

 

7 Habits of Highly Disruptive People

*sedang ikut pelatihan 7 Habits of Highly Effective People yang diselenggarakan oleh kampus untuk para dosen trus iseng bikin improvisasi untuk topik lain*

Habit 1: Be Provocative
Habit 2: Begin with bending the mind
Habit 3: Put first traps’ first
Habit 4: Think Lean and Mean
Habit 5: Seek first to be concealed, and then to conquer
Habit 6: Make surprise!
Habit 7: Tighten the claw

Kenapa Informatika ITB?

Tulisan ini dibuat untuk berpartisipasi dalam gerakan cerita yang ada di sini.

Sesungguhnya Saya tidak pernah membayangkan untuk menempuh studi di bidang Informatika, apalagi hingga menjadi dosen di bidang yang sama. Sejak sekolah dasar Saya sudah akrab dengan elektronika karena sering dimintai tolong untuk membeli komponen di toko oleh Paman yang hobi mengutak-atik elektronik. Bahkan ketika masuk SMP dan ada mata pelajaran Elektronika, saya sangat senang walaupun sebetulnya mata pelajaran tersebut terhitung sebagai muatan lokal.
Read More

Knowledge Vampire

Fenomena ini terjadi di forum diskusi/mailing list di Indonesia.

A: Mas, nanya kalo X gimana caranya? (X = persoalan)
A: kok nggak ada yang jawab yah? (merasa penting sehingga harus dijawab)
A: Oh, sudah terjawab. (sudah mendapat jawaban, mungkin dengan meneror anggota lain atau dari forum tetangga)

suatu ketika ada anggota baru yang kebetulan menghadapi persoalan yang sama (X), Menggunakan fitur pencarian dan menemukan thread tersebut. Merasa tidak mendapatkan jawaban kemudian membuat thread baru. celakanya dengan perilaku yang sama (thread berakhir hanya berisi pertanyaan tanpa jawaban).

Pada akhirnya tidak ada pertambahan pengetahuan melainkan sampah. Situs forum diskusi/mailing list hanya digunakan untuk memenuhi kebutuhan pribadi sebagai tempat konsultasi gratis tanpa terbesit keinginan untuk membentuk pengetahuan bersama.

Mual dengan Rekayasa Perangkat Lunak dan Bahasa Pemrograman

disclaimer
tulisan di bawah ini hanya berisi keluhan pribadi semata disertai dengan pendapat yang sepenuhnya subjektif.

Kadang-kadang saya bosan juga dengan perkembangan industri TIK. Rasa bosan itu muncul karena saya merasa semakin lama produk berlabel teknologi IT ini makin lama semakin menjadi gundukan yang semakin besar. Walau banyak klaim menyatakan bahwa gundukan yang semakin besar ini akan mempermudah dalam penyelesaian persoalan, namun sepertinya gundukan ini tidak jarang malah menjadi persoalan tersendiri di luar persoalan yang sebenarnya ingin diselesaikan.

Saat ini yang sedang ingin saya jadikan kambing hitam adalah Teknologi Bahasa Pemrograman (termasuk di dalamnya arsitektur platform pengembangan aplikasi) dan Bidang Rekayasa Perangkat Lunak. Kedua hal ini sejak dahulu kala seringkali menjadi objek salah kaprah sehingga tidak jarang dijadikan sebagai topik debat kusir. Sebetulnya bahasa pemrograman tidak bisa terlalu dipersalahkan, karena biasanya bahasa pemrograman sering disalah-artikan dan dikait-kaitkan dengan teknologi pengembangan perangkat lunak tertentu yang menjadi pusat pembicaraan.

Read More