Arsip Tag: gui

Pemrograman Qt 16 – QGraphicsScene dan QGraphicsView untuk Menayangkan Gambar


Bismillahirrahmanirrahim.

Tulisan ini tersedia dalam PDF.

qt-creator-logoPembuatan suatu aplikasi image viewer dengan Qt bisa dilakukan dengan kelas QGraphicsScene dan QGraphicsView. Namun niat saya kali ini hanyalah mempersiapkan suatu penampil gambar paling dasar yang hanya bisa menayangkan gambar tanpa fungsi tambahan. Anda akan belajar bagaimana menggunakan kedua kelas tersebut di sini. Selanjutnya, saya berharap nanti bisa menulis kelanjutan dari tulisan ini agar program dapat memiliki fungsi tambahan semisal pan, zoom, rotate, dan lain-lain. Anda dapat mengunduh kode sumber dari program ini di bagian akhir tulisan. Semoga tulisan ini bermanfaat. Baca lebih lanjut

Pemrograman Qt 15 – QToolButton, QFont, dan setStyleSheet()


Bismillahirrahmanirrahim.

Tulisan ini tersedia dalam PDF.

qt-creator-logoQToolButton (saudara kembar QPushButton) adalah widget Qt yang mampu menayangkan ikon sekaligus teks di dalam tombol. Sebagai berita gembira, Qt juga mampu mengatur fonta tombol dengan QFont. Sebagai pelengkap, Qt juga memiliki dukungan penuh untuk style sheet agar Anda bisa mengubah total wajah suatu widget agar sesuai kebutuhan Anda. Misalnya, dengan itu Anda mengubah warna background suatu QLabel sekaligus mengubah fonta teksnya (cukup style sheet tanpa QFont). Semua itu akan dibahas dalam tutorial ini dalam wujud prototipe aplikasi yang mudah diingat wujudnya. Semoga tulisan ini bermanfaat. Baca lebih lanjut

Pemrograman Qt 14 – QPropertyAnimation untuk Animasi GUI


Bismillahirrahmanirrahim.

Tulisan ini tersedia dalam PDF.

qt-creator-logoUbiquity, program pemasang sistem operasi Ubuntu yang kita pakai selalu ketika menginstal, adalah sumber inspirasi program ini. Animasi berbentuk slider layaknya slider di web yang bergerak ketika tombol panah diklik, adalah sesuatu yang gagal diimplementasikan pada Otodidak versi 1. Kegagalan itu disebabkan oleh ketidaktahuan mengenai hard coding di Java terutama pemakaian animasi di dalamnya. Kini dengan Qt, animasi sliding seperti layaknya Ubiquity di Ubuntu serasa mudah untuk dibuat. Kita bisa membuat elemen-elemen GUI bergerak melalui klik tombol dengan memakai kelas animasi di dalam Qt. Salah satunya adalah QPropertyAnimation. Tulisan ini bukan hendak membuat implementasi Ubiquity versi Qt (karena belum mampu) melainkan hanya pengantar menuju ke sana. Semoga tulisan ini bermanfaat. Baca lebih lanjut

Kumpulan Tutorial C++ & Source Code Qt Framework Edisi 1 – 11


Bismillahirrahmanirrahim.

qt-creator-logoBerikut ini tutorial C++ beserta contoh kode sumbernya. Semua kode di sini adalah hasil dari pemrograman Qt saya. Semua kode saya ditulis di Linux dan program saya semuanya memakai Qt Framework untuk menghasilkan GUI. Anda bisa gunakan karya saya ini untuk membuat aplikasi yang lebih bermanfaat. Lisensi semua karya saya ini bebas untuk dipakai apa saja selama tidak untuk maksiat kepada Allah. Semoga bermanfaat. Baca lebih lanjut

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


Bismillahirrahmanirrahim.

Tulisan ini tersedia dalam PDF.

qt-creator-logoAplikasi kalkulator cocok dijadikan latihan memrogram. Kita menemukannya pada banyak tutorial. Dalam 1 aplikasi kalkulator, terdapat banyak elemen GUI dan semuanya harus dihubungkan. Oleh karena itu cocok sekali untuk latihan. Sekarang saya akan membuat sebuah kalkulator sederhana memakai kelas QLineEdit dan teknik casting (konversi tipe data) dari QString ke int (dan sebaliknya). Semoga tulisan ini bermanfaat. Baca lebih lanjut

Pengantar Pemrograman Aplikasi GUI di Linux (Pustaka, Framework, dan IDE)


Bismillahirrahmanirrahim.

Artikel ini tersedia pula dalam PDF.

Apakah Anda ingin membuat aplikasi Linux? Anda ingin membuat aplikasi yang memiliki GUI sebagaimana program yang dibuat dengan Microsoft Visual Basic? Lakukan sekarang juga dengan memilih satu dari beberapa peralatan berikut. Choose one, master it!

Pustaka

1. GTK+

Pustaka ini adalah standar GUI untuk Ubuntu dan distro keluarga Debian lainnya. Pustaka inilah yang digunakan untuk membangun GNOME, Mate, Cinnamon, Nautilus, dan banyak program terkenal di Linux. GTK+ bisa dipakai di semua sistem operasi. Untuk menggunakan GTK, Anda bisa memakai bahasa C/C++ atau Python. Karena sangat banyak aplikasi Linux dibuat dengan GTK+, maka mudah sekali menemukan contoh aplikasi GTK+ yakni dengan membuka kode sumber aplikasi yang dibuat memakai GTK+.

2. Java SWING
Pustaka ini adalah salah satu standar GUI dalam Java. Aplikasi semacam Otodidak dibuat dengannya. Kelebihan Java SWING adalah kelengkapan tutorial resminya yang sempurna beserta besarnya jumlah komunitas programernya. Tutorial SWING berbahasa Indonesia paling banyak jika dibandingkan dengan peralatan lain yang disebutkan dalam posting ini. Jika Anda baru memulai pemrograman GUI, saya sendiri menyarankan untuk memulai dari SWING.

3. Qt Framework

qt-creator-logoQt sebetulnya bukan hanya pustaka, melainkan sudah merupakan framework untuk GUI. Qt itu sangat lengkap dan ia adalah framework yang membangun KDE, Unity, Texmaker, dan lain-lain. Qt memiliki dokumentasi resmi yang sangat lengkap (setara Java) dan komunitas yang sangat besar. Sedikit jumlah tutorial Qt berbahasa Indonesia tetapi jika Bahasa Inggris bukan halangan untuk Anda, maka dokumentasi asli Qt sudah mencukupi bahkan untuk pemula sekalipun. Kelebihan dokumentasi resmi Qt yang lain adalah lebih mudah dipahami dibanding yang lain sehingga pemula pun bisa mengerti dengan cepat. Untuk menggunakan Qt, Anda bisa menggunakan bahasa C++ atau Python.

IDE

1. Gambas

Nama Gambas merujuk kepada IDE sekaligus bahasa pemrogramannya. Gambas disebut sebagai Visual Basic-nya Linux. Jika Anda familiar dengan Microsoft Visual Basic, maka Anda akan mudah menggunakan Gambas.

2. Lazarus

Lazarus biasa disebut Delphi-nya Linux. Ia adalah IDE untuk Pascal. Anda bisa membuat GUI dengan GUI builder di dalamnya.

3. MonoDevelop

MonoDevelop ini IDE untuk membangun aplikasi GUI dengan C# dan .NET Framework. Ia memiliki GUI builder.

Gambar Contoh Aplikasi

Aplikasi GTK+

nautilus

Nautilus

Aplikasi Java SWING

Pemula-1

Otodidak

Aplikasi Qt

dolphin

Dolphin

Aplikasi dengan Gambas

myunity

MyUnity

Aplikasi dengan Lazarus

PeaZip (pengganti WinRAR dan WinZIP)

Aplikasi dengan MonoDevelop

banshee

Banshee Media Player

Gambar IDE

Glade

Netbeans

resized-netbeans

Qt Creator

qtcreator

Gambas

Lazarus

MonoDevelop

Penutup

Tulisan ini hanyalah pengantar. Gambar-gambar di atas sebagian diambil dari Wikipedia atau dari situs aslinya. Semoga benar-benar menjadi pengantar Anda untuk membuat aplikasi Linux. Semoga bermanfaat untuk Anda.

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


Bismillahirrahmanirrahim.

Unduh tutorial ini versi PDF.

qt-creator-logoAplikasi GUI membutuhkan User Experience Design (UX)  yang baik. Di antara poin penting UX adalah membuat pengguna tahu apa yang harus dilakukan. Salah satu metode untuk merealisasikan hal itu adalah dengan memberikan emphasizing untuk bagian-bagian user interface (UI) tertentu. Emphasizing ada banyak macam, dan salah satu yang terbaik adalah suara ketika terdapat event yang dikerjakan. Metode emphasize dengan suara ini diterapkan di jejaring sosial Facebook ketika terdapat notifikasi komentar, pernyataan suka, pesan masuk, dan segala yang menyinggung pengguna secara langsung. Metode ala Facebook inilah yang akan kita terapkan pada program Qt kali ini. Kita akan membuat aplikasi yang tombol-tombolnya memiliki suara sendiri ketika diklik. Tujuan pembuatan program ini adalah memberikan UX terbaik bagi pengguna.

Mengenal Phonon Framework

Apa itu Phonon? Apa hubungannya dengan Qt? Apa hubungannya dengan program kita ini? Secara sederhana, Phonon memungkinkan Anda memutar suara di dalam program Qt. Secara lebih kompleks, Phonon adalah suatu API tersendiri di dalam Qt yang bertugas mengendalikan video dan audio. Phonon sanggup mengimpor audio/video, memutarnya, memberlakukan loop untuknya, melakukan pause, dan hal-hal wajar yang Anda dapatkan dengan audio player pada umumnya. Sebagai contoh, Amarok adalah aplikasi Qt yang memanfaatkan Phonon untuk memutar audio.

Mengenal OGG Vorbis

Jika Anda hanya mengenal MP3 saja sebagai satu-satunya format audio, maka mulailah mengenal format audio satu ini. Namanya adalah OGG Vorbis. Ia adalah format audio yang berlawanan sifat dengan MP3 yakni ia bersifat terbuka bebas, sedangkan MP3 dimiliki (proprietary) oleh pihak tertentu. Mengapa harus OGG? Karena format OGG sudah tersedia dukungannya di Ubuntu secara default sedangkan MP3 tidak. Sehingga, kalaupun Anda belum menginstal paket-paket gstreamer untuk memutar MP3 di Ubuntu Anda saat menerapkan tutorial ini, maka suara tombol tetap bisa Anda dengar karena Ubuntu dapat memutar suara OGG. Tutorial ini akan menggunakan berkas audio OGG sebagai sumber suara tombol. Anda dapat mengunduhnya pada bagian (\refunduh) Unduh Kode Sumber di bawah.

Spesifikasi Sistem

  • Ubuntu 12.04
  • Qt Creator 2.4.1
  • Qt 4.8.0 (32 bit)

Daftar Kelas

  • Phonon::MediaObject
  • QCoreApplication

Daftar Method

  • play()
  • setApplicationName()

Kode

Seperti biasa, hanya 2 berkas yang perlu diperhatikan.
mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QtGui>
#include <QSound>

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();

    QPushButton     *satu;
    QPushButton     *dua;
    QPushButton     *tiga;
    QPushButton     *empat;
    QWidget         *widget;
    QVBoxLayout     *vl;

public slots:
//    void bersuara();

private:
    Ui::MainWindow *ui;
};

#endif // MAINWINDOW_H

mainwindow.cpp

//program mini ini bernama SuaraTombol
//program ini dibuat untuk mempelajari penggunaan Phonon Framework untuk memutar suara ketika tombol diklik
//tujuan akhir dari program ini adalah Perfect User Experience meniru notifikasi Facebook
//ketika pengguna Facebook menjadi sangat termudahkan bersosial ketika ada suara setiap ada notifikasi muncul
//hal yang terpenting dalam UX adalah _membuat_pengguna_tahu_apa_yang_harus_dilakukan_

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <phonon/Phonon/MediaObject>  //perhatikan pustaka baru yang digunakan

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    vl              =       new     QVBoxLayout;

    satu            =       new     QPushButton("SATU");
    dua             =       new     QPushButton("DUA");
    tiga            =       new     QPushButton("TIGA");
    empat           =       new     QPushButton("EMPAT");
    widget          =       new     QWidget;

    satu->setMinimumSize(88,55);
    dua->setMinimumSize(88,55);
    tiga->setMinimumSize(88,55);
    empat->setMinimumSize(88,55);

    QCoreApplication::setApplicationName( "SuaraTombol" );

    Phonon::MediaObject *bunyi_tombol_satu  = Phonon::createPlayer(Phonon::MusicCategory, Phonon::MediaSource("KDE-Sys-Special.ogg"));
    Phonon::MediaObject *bunyi_tombol_dua   = Phonon::createPlayer(Phonon::MusicCategory, Phonon::MediaSource("KDE-K3B-Finish-Success.ogg"));
    Phonon::MediaObject *bunyi_tombol_tiga  = Phonon::createPlayer(Phonon::MusicCategory, Phonon::MediaSource("KDE-Im-Message-Out.ogg"));
    Phonon::MediaObject *bunyi_tombol_empat = Phonon::createPlayer(Phonon::MusicCategory, Phonon::MediaSource("KDE-Im-Message-In.ogg"));

    connect(satu,  SIGNAL(clicked()), bunyi_tombol_satu,  SLOT(play()));
    connect(dua,   SIGNAL(clicked()), bunyi_tombol_dua,   SLOT(play()));
    connect(tiga,  SIGNAL(clicked()), bunyi_tombol_tiga,  SLOT(play()));
    connect(empat, SIGNAL(clicked()), bunyi_tombol_empat, SLOT(play()));

    vl->addWidget(satu);
    vl->addWidget(dua);
    vl->addWidget(tiga);
    vl->addWidget(empat);

    widget->setLayout(vl);

    this->setCentralWidget(widget);

}

MainWindow::~MainWindow()
{
    delete ui;
}

Qt Creator dan Kode

resized_ngite-kesebelas2

Hasil

Berikut ini tampilan SuaraTombol.

ngite-kesebelas

Ketika tombol SATU diklik, maka KDE-Sys-Special.ogg dimainkan. Ketika tombol DUA diklik, maka KDE-K3B-Finish-Success.ogg dimainkan. Dan seterusnya.

Bug

Ketika salah satu tombol diklik, lalu suara dimainkan, lalu dilakukan satu klik lagi sebelum suara pertama usai (interupsi), maka ada standard error muncul Aborting aboutToFinish handling. disertai mogoknya tombol yang diinterupsi. Saya belum menemukan solusinya setelah googling (26 Oktober 2013).

Pembahasan

mainwindow.h

Tidak ada yang istimewa pada header kita kali ini. Jika Anda belum memahami cara deklarasi di dalam header ini, silakan merujuk ke penjelasan deklarasi header.

mainwindow.cpp

Yang perlu diperhatikan pada berkas CPP kita kali ini adalah bagian deklarasi objek dari kelas Phonon::MediaObject dan adanya satu baris deklarasi QCoreApplication. Jika Anda belum memahami cara membuat GUI pada CPP ini, silakan merujuk ke penjelasan cara membuat GUI dasar.

Phonon::MediaObject *bunyi_tombol_satu =
Phonon::createPlayer(Phonon::MusicCategory,
Phonon::MediaSource("KDE-Sys-Special.ogg"));

Deklarasi di atas membentuk sebuah objek yang saya namakan bunyi_tombol_satu dari kelas Phonon::MediaObject. Yang istimewa di sini adalah nama kelas Phonon::MediaObject. Biasanya kita memakai kelas dengan satu kata saja. Kali ini, kita memakai kelas Qt yang terdiri dari dua bagian berbeda yakni namespace Phonon dan kelas MediaObject. Perhatikan juga bahwa saya meletakkan di parameter-nya nama berkas OGG secara langsung tanpa path. Artinya, saya telah meletakkan berkas yang ditulis namanya itu pada folder tempat program di-build. Karena program saya di-build di folder /home/master/Publik/QtProject/SuaraTombol-build-desktop-Qt_4_8_1_in_PATH__System__Release/, maka saya taruh berkas OGG di folder itu. Jika Anda meletakkan berkas OGG pada /home/ridwan, maka nanti tulis lengkap alamat path OGG di parameter-nya /home/ridwan/KDE-Sys-Special.ogg.

QCoreApplication::setApplicationName( "SuaraTombol" );

Deklarasi satu baris di atas wajib ada jika kita membuat program dengan Phonon. Saya belum menemukan alasannya tetapi yang pasti, jika kita hilangkan, maka pasti terjadi galat ketika kompilasi.

Unduh Kode Sumber

Program kali ini bernama SuaraTombol. Di dalamnya sudah tersedia berkas OGG yang digunakan para tulisan ini. Silakan diunduh dan dibuka di Qt Creator Anda.

Alamat: http://otodidak.freeserver.me/tarball/SuaraTombol.tar.gz
Ukuran: 125 KB

Kesimpulan

  • Harus ada QCoreApplication::setApplicationName() untuk membuat program dengan Phonon.
  • Program Qt bisa memainkan suara ketika tombol diklik sebagai notifikasi untuk pengguna.

Referensi

 

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


Bismillahirrahmanirrahim.

Tulisan ini tersedia dalam PDF.

qt-creator-logoTulisan ini menjelaskan bagaimana membuat sebuah aplikasi kecil repo changer yang bisa mengganti konfigurasi repositori Ubuntu kita dan bisa membaca isi sources.list kita secara mudah dengan Qt. Aplikasi ini masih bersifat percobaan dan sama sekali bukan versi final. Seperti biasa, pada akhir tulisan disertakan tautan unduh kode sumbernya. Seluruh informasi repositori dalam tulisan ini diambil dari tulisan https://malsasa.wordpress.com/2013/10/15/daftar-lengkap-repositori-lokal-ubuntu-12-04-plus-cara-mengaturnya/. Semoga tulisan ini bermanfaat.

Spesifikasi Sistem

  1. Ubuntu 12.04
  2. Qt Creator 2.4.1
  3. Qt 4.8.0 (32 bit)

Daftar Kelas

  1. QTextEdit
  2. QFile
  3. QProcess
  4. QStringList
  5. QString
  6. QLabel

Daftar Method

  1. start()
  2. waitForFinished()
  3. setText() (milik QLabel)
  4. setReadOnly() (milik QTextEdit)
  5. readAllStandardOutput() (milik QProcess)

Cuma 5? Ya, cuma 5.

Arah Tulisan Ini

Tulisan ini akan menjelaskan bagaimana membuat program yang bisa melakukan hal-hal berikut

  1. Jika satu tombol diklik, maka isi sources.list berubah.
  2. Klik tombol Kambing maka isi sources.list berisi konfigurasi repo Kambing, klik tombol UGM maka berisi konfigurasi repo UGM, dan seterusnya.
  3. Klik tombol Baca maka isi sources.list akan ditayangkan di QTextEdit.
  4. Klik tombol Kambing, maka indikator (QLabel) menayangkan bahwa repo saat ini adalah Kambing dan seterusnya.

ngite-kesepuluh1

Secara teknis, kita akan belajar bagaimana menggunakan QTextEdit, membaca standard output, memasukkan standard output ke dalam QTextEdit, membuat berkas teks dengan Qt, dan menulis string di C++.

Apa Itu Standard Output?

Standard output adalah teks yang dikeluarkan oleh program dari dalam sistem setelah melakukan suatu proses. Biasanya kita melihat standard output di dalam Terminal. Contohnya ketika kita gunakan perintah ls -l maka keluarannya seperti ini:

total 3960
-rw-r--r-- 1 master master 2673568 Mar 13  2011 kbbi.dict.dz
-rw-r--r-- 1 master master 1348181 Mar 13  2011 kbbi.idx
-rw-r--r-- 1 master master     297 Mar 13  2011 kbbi.ifo
-rw-r--r-- 1 master master   24330 Mar 13  2011 kbbi.syn

Keluaran di atas disebut standard output. Pendek kata, keluaran dari segala perintah Linux adalah standard output. Yang paling penting untuk diingat adalah standard output itu dikeluarkan secara broadcast (seperti siaran televisi) sehingga tidak hanya Terminal kita saja sebetulnya yang bisa menayangkan keluaran tersebut. Jika kita membuat aplikasi yang bisa membaca standard output, maka keluaran dari perintah Linux apa saja bisa ditayangkan di dalam aplikasi kita. Artinya, tidak perlu membuka Terminal lagi untuk menayangkan keluaran perintah yang kita panggil. Mirip Synaptic yang bisa menayangkan keluaran dpkg secara realtime ketika menginstal program.

Antara Standard Output dan Program Ini

Apa hubungan standard output dengan program kali ini? Hubungannya adalah program kita ini harus bisa membaca isi dari berkas teks (sources.list). Metode pembacaan berkas ada banyak sekali. Kita pilih satu mettode saja, yakni menggunakan cat. Kita mengenal perintah cat (concatenate) untuk mengeluarkan isi teks ke layar Terminal. Kalau kita lakukan perintah cat sources.list, maka teks isinya akan ditayangkan di layar Terminal. Teks inilah standard output. Jika kita bisa menangkapnya, maka teks dari sources.list bisa ditayangkan di dalam aplikasi kita. Pembacaan standard output adalah rahasianya.

Mengenai sources.list Kita

Kita tidak akan menyentuh berkas sources.list yang asli pada /etc/apt/sources.list karena ini adalah berkas sistem. Berkas ini berisi baris-baris alamat repo kita. Kalau terdapat kesalahan satu huruf saja di dalamnya, apt pasti menayangkan pesan error ketika kita menginstal aplikasi. Jika sudah error, maka kita harus membetulkannya secara manual. Selain itu, jika kita buka berkas sources.list buatan sendiri di /home, otomatis Synaptic Package Manager akan terbuka karena adanya asosiasi sistem. Walaupun sebenarnya tidak masalah, tetapi kita memilih jalan paling praktis yakni membuat berkas bernama sources. Ya, sources begitu saja tanpa akhiran .list. Berkas ini diibaratkan sebagai sources.list betulan sehingga apa yang bisa dilakukan dengan ini, pasti hasilnya sama jika dilakukan pada sources.list yang asli. Berkas ini akan dibuat di dalam direktori build yang diciptakan otomatis oleh Qt Creator. Dalam Ubuntu saya, berkas ini akan dibuat di direktori /home/master/Publik/QtProject/ProyekRC-build-desktop-Qt_4_8_1_in_PATH__System__Release/.

ngite-kesepuluh3

Kode

mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include &lt;QMainWindow&gt;
#include &lt;QtGui&gt;

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();
    QGridLayout         *vl;
    QVBoxLayout         *sl;
    QVBoxLayout         *dl;
    QWidget             *widget;
    QPushButton         *pb_kambing;
    QPushButton         *pb_fossid;
    QPushButton         *pb_ugm;
    QPushButton         *pb_buaya;
    QPushButton         *pb_baca;
    QTextEdit           *te_baca;
    QLabel              *lb_repo;

public slots:
    void ganti_ke_kambing();
    void ganti_ke_fossid();
    void ganti_ke_ugm();
    void ganti_ke_buaya();
    void baca_sources_list();

private:
    Ui::MainWindow *ui;
};

#endif // MAINWINDOW_H

mainwindow.cpp

//ProyekRC = Proyek Repo Changer
//proyek mini ini dibuat sebagai bak pasir bagi saya untuk mempelajari I/O, string,
//dan pembuatan berkas teks dengan Qt
//16 Oktober 2013
#include &quot;mainwindow.h&quot;
#include &quot;ui_mainwindow.h&quot;

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    vl          =           new         QGridLayout();
    sl          =           new         QVBoxLayout();
    dl          =           new         QVBoxLayout();
    widget      =           new         QWidget();
    pb_kambing  =           new         QPushButton(&quot;KAMBING&quot;);
    pb_fossid   =           new         QPushButton(&quot;FOSS-ID&quot;);
    pb_ugm      =           new         QPushButton(&quot;UGM&quot;);
    pb_buaya    =           new         QPushButton(&quot;BUAYA&quot;);
    pb_baca     =           new         QPushButton(&quot;BACA&quot;);
    te_baca     =           new         QTextEdit;
    lb_repo     =           new         QLabel;

    vl-&gt;addWidget(pb_kambing, 1, 1);
    vl-&gt;addWidget(pb_fossid, 1, 2);
    vl-&gt;addWidget(pb_ugm, 1, 3);
    vl-&gt;addWidget(pb_buaya, 2, 1);
    vl-&gt;addWidget(pb_baca, 2, 2);
    vl-&gt;addWidget(lb_repo, 2, 3);
    vl-&gt;setHorizontalSpacing(3);
    vl-&gt;setVerticalSpacing(3);
    dl-&gt;addWidget(te_baca);

    pb_kambing-&gt;setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
    pb_fossid-&gt;setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
    pb_ugm-&gt;setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
    pb_buaya-&gt;setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
    pb_baca-&gt;setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
    te_baca-&gt;setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);

    pb_kambing-&gt;setMinimumHeight(55);     //pb_kambing-&gt;setMaximumWidth(133);
    pb_fossid-&gt;setMinimumHeight(55);      //pb_fossid-&gt;setMaximumWidth(133);
    pb_ugm-&gt;setMinimumHeight(55);         //pb_ugm-&gt;setMaximumWidth(133);
    pb_buaya-&gt;setMinimumHeight(55);       //pb_buaya-&gt;setMaximumWidth(133);
    pb_baca-&gt;setMinimumHeight(55);        //pb_baca-&gt;setMaximumWidth(133);
    te_baca-&gt;setMinimumSize(575,199);

    sl-&gt;addLayout(vl);
    sl-&gt;addLayout(dl);

    widget-&gt;setLayout(sl);

    this-&gt;setCentralWidget(widget);

    //saatnya mengasosiasikan tombol dengan fungsi
    connect(pb_kambing, SIGNAL(clicked()), this, SLOT(ganti_ke_kambing()));
    connect(pb_fossid, SIGNAL(clicked()), this, SLOT(ganti_ke_fossid()));
    connect(pb_ugm, SIGNAL(clicked()), this, SLOT(ganti_ke_ugm()));
    connect(pb_buaya, SIGNAL(clicked()), this, SLOT(ganti_ke_buaya()));
    connect(pb_baca, SIGNAL(clicked()), this, SLOT(baca_sources_list()));

}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::ganti_ke_kambing()
{
    QStringList argumen;
    argumen &lt;&lt; &quot;-c&quot; &lt;&lt;
           &quot;echo 'deb http://kambing.ui.ac.id/ubuntu precise main restricted multiverse universe\n&quot;
                 &quot;deb http://kambing.ui.ac.id/ubuntu/ precise-update main restricted multiverse universe\n&quot;
                 &quot;deb http://kambing.ui.ac.id/ubuntu/ precise-security main restricted universe multiverse\n&quot;
                 &quot;deb http://kambing.ui.ac.id/ubuntu/ precise-backports main restricted universe multiverse' &gt; sources&quot;;
    /* C++ itu otomatis melakukan concatenate (penggabungan) untuk string yang dipisahkan barisnya seperti di atas
    - perhatikan &quot; dan ' di sana, asalnya baris-baris string itu satu
    - Tanda ' ditangguhkan sampai baris terakhir supay seluruh baris dianggap sebaris oleh QStringList
    - jangan lupakan \n (newline) di setiap akhir baris karena sources.list itu berkas berbahaya
    - sementara berkas keluaran tidak dinamakan _sources.list_ karena asosiasi penyunting teks dalam sistem
    - sumber: http://stackoverflow.com/questions/4276026/how-to-write-a-qstring-on-several-lines
    16 Oktober 2013 */

    QProcess perintah;
    perintah.start(&quot;/bin/bash&quot;, argumen);
    perintah.waitForFinished(-1);

    //baru terpikir pada 17 Oktober
    this-&gt;lb_repo-&gt;setText(&quot;&lt;b&gt;Repo Sekarang: Kambing&lt;/b&gt;&quot;);
}

void MainWindow::ganti_ke_fossid()
{
    QStringList argumen;
    argumen &lt;&lt; &quot;-c&quot; &lt;&lt;
            &quot;echo 'deb http://dl2.foss-id.web.id/ubuntu/ precise main restricted universe multiverse\n&quot;
                  &quot;deb http://dl2.foss-id.web.id/ubuntu/ precise-updates main restricted universe multiverse\n&quot;
                  &quot;deb http://dl2.foss-id.web.id/ubuntu/ precise-security main restricted universe multiverse\n&quot;
                  &quot;deb http://dl2.foss-id.web.id/ubuntu/ precise-backports main restricted universe multiverse' &gt; sources&quot;;

    QProcess perintah;
    perintah.start(&quot;/bin/bash&quot;, argumen);
    perintah.waitForFinished(-1);

    this-&gt;lb_repo-&gt;setText(&quot;&lt;b&gt;Repo Sekarang: FOSS-ID&lt;/b&gt;&quot;);
}

void MainWindow::ganti_ke_ugm()
{
    QStringList argumen;
    argumen &lt;&lt; &quot;-c&quot; &lt;&lt;
            &quot;echo 'deb http://repo.ugm.ac.id/ubuntu/ precise main restricted universe multiverse\n&quot;
                  &quot;deb http://repo.ugm.ac.id/ubuntu/ precise-updates main restricted universe multiverse\n&quot;
                  &quot;deb http://repo.ugm.ac.id/ubuntu/ precise-security main restricted universe multiverse' &gt; sources&quot;;

    QProcess perintah;
    perintah.start(&quot;/bin/bash&quot;, argumen);
    perintah.waitForFinished(-1);

    this-&gt;lb_repo-&gt;setText(&quot;&lt;b&gt;Repo Sekarang: UGM&lt;/b&gt;&quot;);
}

void MainWindow::ganti_ke_buaya()
{
    QStringList argumen;
    argumen &lt;&lt; &quot;-c&quot; &lt;&lt;
            &quot;echo 'deb http://buaya.klas.or.id/ubuntu/ precise main restricted universe multiverse\n&quot;
                  &quot;deb http://buaya.klas.or.id/ubuntu/ precise-updates main restricted universe multiverse\n&quot;
                  &quot;deb http://buaya.klas.or.id/ubuntu/ precise-security main restricted universe multiverse' &gt; sources&quot;;

    QProcess perintah;
    perintah.start(&quot;/bin/bash&quot;, argumen);
    perintah.waitForFinished(-1);

    this-&gt;lb_repo-&gt;setText(&quot;&lt;b&gt;Repo Sekarang: Buaya&lt;/b&gt;&quot;);
}

void MainWindow::baca_sources_list()
{
    //kode ini saya buat dengan menebak saja
    QString isi_sources_list;
    QProcess perintah_baca_sources;
    perintah_baca_sources.start(&quot;cat sources&quot;);
    perintah_baca_sources.waitForFinished(-1);
    isi_sources_list = perintah_baca_sources.readAllStandardOutput();

    this-&gt;te_baca-&gt;setText(isi_sources_list);
    this-&gt;te_baca-&gt;setReadOnly(true);
}

Qt Creator dan Kode

resized_ngite-kesepuluh2

Hasil

ngite-kesepuluh4

Jika tombol KAMBING diklik, maka QLabel akan memberikan informasi bahwa repo sekarang adalah Kambing. Perhatikan, QTextEdit masih kosong.

ngite-kesepuluh5

Barulah setelah tombol BACA diklik, maka QTextEdit membaca isi dari berkas sources kita.

Pembahasan

Pembahasan untuk kode sumber kali ini hanya berpusat pada mainwindow.cpp saja.

mainwindow.h

Isi header kali ini masih selaras dengan header program sebelumnya. Silakan merujuk ke sana jika Anda belum paham cara deklarasi dalam header ini.

mainwindow.cpp

Ada 2 bagian saja yang penting dalam berkas cpp kita kali ini. Bagian kelas utamanya (pembentukan jendela) tidak perlu diperhatikan. Namun jika Anda belum paham soal bagaimana membentuk jendela dan membuat koneksi SIGNAL & SLOT dengan Qt, silakan merujuk ke sini dan ke sini.

1. Fungsi Ganti Repo & Notifikasi QLabel

void MainWindow::ganti_ke_kambing()
{
    QStringList argumen;
    argumen &lt;&lt; &quot;-c&quot; &lt;&lt;
           &quot;echo 'deb http://kambing.ui.ac.id/ubuntu precise main restricted multiverse universe\n&quot;
                 &quot;deb http://kambing.ui.ac.id/ubuntu/ precise-update main restricted multiverse universe\n&quot;
                 &quot;deb http://kambing.ui.ac.id/ubuntu/ precise-security main restricted universe multiverse\n&quot;
                 &quot;deb http://kambing.ui.ac.id/ubuntu/ precise-backports main restricted universe multiverse' &gt; sources&quot;;

    QProcess perintah;
    perintah.start(&quot;/bin/bash&quot;, argumen);
    perintah.waitForFinished(-1);

    this-&gt;lb_repo-&gt;setText(&quot;&lt;b&gt;Repo Sekarang: Kambing&lt;/b&gt;&quot;);
}

Kode di atas adalah fungsi buatan sendiri. Nama fungsinya ganti_ke_kambing(). Isinya adalah deklarasi lokal dan fungsi-fungsi Qt untuk mengubah isi berkas source dengan teks pengaturan repositori Kambing UI. Cara kerja fungsinya adalah menggunakan QProcess sebagai pemanggil /bin/bash dan QStringList sebagai penampung argumen yakni perintah bash yang sebenarnya dipakai. Perintah bash yang dipakai adalah echo dengan memakai redirector ‘>‘ untuk membuat berkas sources. Jika Anda belum memahami metode pemanggilan perintah shell ini, silakan merujuk ke sini.

Kode di atas jika dijalankan, maka akan mengosongkan seluruh isi sources lalu menimpanya dengan teks yang tersebut dalam echo. Ini karena sifat redirector ‘>’ yang me-replace isi teks.   Tidak berhenti sampai situ. Pengguna memerlukan notifikasi yang menandakan konfigurasi repo telah berubah ke server tertentu. Maka dipanggillah fungsi setText() milik objek lb_repo (QLabel) dalam jendela (this). Kodenya adalah this->lb_repo->setText(“Repo Sekarang: Kambing”);. Cara kerja ini sama untuk fungsi-fungsi ganti_ke_*() di bawahnya.

Masalah C++ yang penting untuk diketahui adalah model penyimpanan string di dalam objek QString. Untuk memudahkan penulisan, kita harus menaruh satu baris URL repo di bawah baris yang lain. Kalau kita tulis memanjang ke samping, kode kita jadi tidak nyaman dibaca. Maka kita memakai salah satu fitur C++ itu sendiri yakni sanggup menggabungkan (concatenate) string yang terpisah baris tetapi setiap baris diapit dengan tanda petik ganda (“”) tanpa mengakhirkan apa-apa setelah terakhir. Coba perhatikan kode ini:

argumen &lt;&lt; &quot;-c&quot; &lt;&lt;
&quot;echo 'deb http://kambing.ui.ac.id/ubuntu precise main restricted multiverse universe\n&quot;
&quot;deb http://kambing.ui.ac.id/ubuntu/ precise-update main restricted multiverse universe\n&quot;
&quot;deb http://kambing.ui.ac.id/ubuntu/ precise-security main restricted universe multiverse\n&quot;
&quot;deb http://kambing.ui.ac.id/ubuntu/ precise-backports main restricted universe multiverse' &gt; sources&quot;;

Mari perhatikan perbedaan pemakaian tanda  (petik tunggal) dan  (petik ganda) dalam kode ini. Perhatikan pemakaian sebelum echo dan sesudah sources. Mereka berdua adalah pengapit seluruh baris. Perhatikan sebelum deb pada baris pertama dan sesudah multiverse pada baris terakhir. Itu adalah pengapit string bagi perintah echo. Jadi, echo punya string sendiri dan variabel argumen di sini punya string sendiri juga. Ada string di dalam string. Dan otomtis C++ menganggap semua baris sebagai satu string karena “” pada setiap baris hingga akhir tanpa ada tambahan karakter di setiap akhir baris. Ingat, harus ada escape character untuk newline (Enter) pada akhir setiap string karena kita harus mengikuti standar apt dalam mengisi sources.list yakni satu URL dalam satu baris, tidak boleh salah. Begitu caranya membuat banyak baris dalam 1 string di dalam C++.

2. Fungsi Baca Berkas


void MainWindow::baca_sources_list()
{
    QString isi_sources_list;
    QProcess perintah_baca_sources;
    perintah_baca_sources.start(&quot;cat sources&quot;);
    perintah_baca_sources.waitForFinished(-1);
    isi_sources_list = perintah_baca_sources.readAllStandardOutput();

    this-&gt;te_baca-&gt;setText(isi_sources_list);
    this-&gt;te_baca-&gt;setReadOnly(true);
}

Kode ini berbeda dengan semua fungsi ganti_ke_*() sebelumnya. Kode ini adalah fungsi yang dikoneksikan dengan tombol BACA (pb_baca). Namanya baca_sources_list(). Isinya deklarasi lokal dan fungsi bagi QProcess untuk membaca standard output dari perintah cat sources.

Yang perlu diperhatikan adalah baris

isi_sources_list = perintah_baca_sources.readAllStandardOutput();

Maksud baris tersebut adalah memasukkan apa yang ditangkap oleh method readAllStandardOutput() di dalam objek perintah_baca_sources, ke dalam variabel isi_sources_list. Ini cara kita menangkap standard output. Setelah itu, kita memasukkan hasil tangkapan tadi ke dalam QTextEdit dengan kode

this->te_baca->setText(isi_sources_list);

maka jadilah apa yang kita inginkan yaitu menampilkan isi berkas sources ke dalam aplikasi kita. Ya, rahasianya adalah dengan memakai perintah bash lalu membaca standard outputnya. Masih banyak cara lain yang belum saya mengerti. Sementara, kita akan memakai cara ini untuk program-program berikutnya.

Unduh Kode Sumber

Program kali ini bernama ProyekRC (Repo Changer). Silakan unduh dan impor di Qt Creator Anda.

Kesimpulan

  1. Pembacaan standard output di Qt bisa dilakukan dengan QProcess melalui method readAllStandardOutput().
  2. QTextEdit bisa dipakai untuk menerima penulisan teks dari pengguna maupun menayangkan teks dari program. Bahkan bisa menayangkan standard output.

Rujukan

Pemrograman Qt 9 – QProcess dan Menjalankan Perintah Linux


Bismillahirrahmanirrahim.

qt-creator-logoKita bisa mengomando Linux melalui GUI. Bagaimana caranya? Ada banyak cara. Lihat dulu contoh semisal Ubuntu Tweak. Aplikasi tersebut menggantikan ratusan perintah Terminal dengan beberapa tombol saja. Jika Anda menekan satu tombol di Ubuntu Tweak, maka itu berarti menjalankan perintah tertentu. Konsep ini (GUI front-end) sangat berguna jika kita ingin membuat aplikasi yang melakukan otomatisasi perintah Terminal yang biasa kita kerjakan. Misalnya kita ingin mengganti alamat sumber repositori Ubuntu. Apa yang kita lakukan? Ubah sources.list secara manual, ketik sendiri alamat-alamat yang banyak itu dari hafalan Anda, lakukan update. Hal yang seperti ini bisa dibuatkan GUI supaya otomatis dengan menyimpan alamat-alamat sumber repositori lalu menambahkan tombol untuk masing-masing repositori. Jadi, cukup satu klik untuk mengganti repositori kita ke server Kambing atau UGM atau yang lain. Ini contoh saja. Sekarang kita akan membuat yang lebih sederhana dari itu. Kita akan memakai QProcess (sebagai ganti method system() kemarin) untuk menjalankan perintah Linux lebih canggih lagi di dalam Qt. Mengapa kita beralih ke QProcess? Nanti kita akan tahu, insya Allah.

Spesifikasi Sistem

  1. Ubuntu 12.04
  2. Qt Creator 2.4.1
  3. Qt 4.8.0 (32 bit)

Daftar Kelas

  1. QProcess
  2. QStringList
  3. QByteArray

Daftar Method

  • start() milik QProcess.
  • waitForFinished() milik QProcess.
  • readAll() milik QProcess.
  • printf() method standar iostream dari C++.

Arah Tulisan Ini

Saya hanya ingin menunjukkan bagaimana aplikasi Qt bisa dibuat seperti contoh di atas, seperti Ubuntu Tweak yang satu tombolnya menggerakkan beberapa perintah Terminal. Dan saya bilang kali ini lebih canggih karena kita bisa menangkap keluaran dari perintah yang dijalankan. Ini penting untuk mewujudkan aplikasi-aplikasi yang dapat mengeksekusi perintah Terminal, menangkap keluarannya, memroses keluaran tersebut, lalu membuat keluaran baru. Contoh nyatanya adalah aplikasi pengganti sources.list otomatis pada paragraf pertama di atas.

Kode

mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QtGui>

class Dialog : public QDialog
{
    Q_OBJECT

public:
    Dialog();
    QVBoxLayout *layout;
    QPushButton *tombola;
    QPushButton *tombolb;
    QPushButton *tombolc;

public slots:
    void perintah_cat();
    void perintah_mkdir();
    void perintah_ls();

private:

};

#endif // MAINWINDOW_H

mainwindow.cpp

#include <iostream>
#include <QtGui>
#include <mainwindow.h>

Dialog::Dialog()   //kagak usah dikasih void
{
    layout  = new QVBoxLayout;
    tombola = new QPushButton("cat");
    tombolb = new QPushButton("mkdir");
    tombolc = new QPushButton("ls");

    tombola->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
    tombolb->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
    tombolc->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);

    tombola->setMinimumSize(88,55);
    tombolb->setMinimumSize(88,55);
    tombolc->setMinimumSize(88,55);

    layout->addWidget(tombola);
    layout->addWidget(tombolb);
    layout->addWidget(tombolc);

    setLayout(layout);

    connect(tombola, SIGNAL(clicked()), this, SLOT(perintah_cat()));
    connect(tombolb, SIGNAL(clicked()), this, SLOT(perintah_mkdir()));
    connect(tombolc, SIGNAL(clicked()), this, SLOT(perintah_ls()));
}

void Dialog::perintah_cat()
{
    QProcess *cat = new QProcess;
    cat->start("/bin/bash -c \"rm isifolder.txt\"");
}

void Dialog::perintah_mkdir()
{
    QProcess sh;
    sh.start("sh", QStringList() << "-c" << "ifconfig | grep inet");

    sh.waitForFinished(-1);
    QByteArray output = sh.readAll();
    printf(output);
}

void Dialog::perintah_ls()
{
    QStringList options;
    options << "-c" << "ls -l | grep a | sort > isifolder.txt";

    QProcess process;
    process.start("/bin/sh", options);
    process.waitForFinished(-1);
}

Qt Creator dan Kode

ngite-kesembilan8

Panel sebelah kiri berisi mainwindow.cpp dan sebelah kanan mainwindow.h.

Hasil Kode

Tampilan program kali ini sama dengan sebelumnya. Bedanya, isi perintah untuk masing-masing tombol saya ubah. Saya akan jelaskan satu per satu hasil perintah mulai dari tombol ketiga.

Tombol ls

Isi tombol ls adalah perintah untuk mendaftar isi folder tempat si program berada, menyaring supaya hanya informasi yang memiliki huruf a saja yang ditampilkan, lalu menuliskannya ke sebuah berkas teks bernama isifolder.txt.

ngite-kesembilan1 ngite-kesembilan2

Jika tombol ls ditekan, maka perintah ls -l | grep -a > isifolder.txt dijalankan. Maka jadilah satu berkas teks bernama isifolder.txt.

ngite-kesembilan3

Demikian isi dari berkas isifolder.txt.

ngite-kesembilan9

Demikian keluaran (standard output) dari perintah yang sama tetapi dijalankan dari Terminal. Sama persis dengan isi teks. Ini berarti program valid.

Tombol mkdir

Isi tombol mkdir adalah perintah untuk mengeluarkan informasi jaringan pada baris yang memiliki teks inet saja (membuang semua baris yang lain) dan informasi itu dicetak di dalam Terminal saja. Perintahnya adalah ifconfig | grep inet.

ngite-kesembilan6

Keluaran (standard output) hanya muncul setelah program ditutup.

ngite-kesembilan7

Sama keluarannya (standard output di Terminal asli dengan Terminal di Qt Creator). Valid.

Tombol cat

Isi tombol cat adalah perintah untuk menghapus berkas isifolder.txt yang sudah ada. Karena inilah saya jelaskan dari bawah ke atas.

Pembahasan

mainwindow.h

Sama seperti tulisan sebelumnya. Jika Anda belum mengerti model deklarasi dalam header ini, silakan merujuk ke sini.

mainwindow.cpp

Pada berkas .cpp proyek ini, ada 3 fungsi buatan yang perlu diperhatikan karena inilah inti program. Kita punya 3 model eksekusi perintah Terminal di Qt, setidaknya dalam program ini. Jika Anda belum mengerti bagaimana membangun elemen-elemen GUI dengan Qt, silakan merujuk ke sini.

  • Model Eksekusi Perintah Pertama
QProcess *cat = new QProcess;
cat->start("/bin/bash -c \"rm isifolder.txt\"");

Kita membuat sebuah objek bernama cat (dari nama cat (concatenate) bukan kucing) dari kelas QProcess. Lalu, dengan objek ini, kita panggil fungsi start(). Di dalam start() ini kita masukkan string yang merupakan perintah Terminal. Perhatikanlah, kita tidak langsung menulis perintah rm isifolder.txt seperti biasa dilakukan di Terminal. Kita mesti mengawali string perintah dengan /bin/bash. Lalu gunakanlah argumen -c (artinya membaca perintah bash dari string) milik /bin/bash tersebut. Lalu barulah kita tuliskan perintah yang ingin dilakukan. Perhatikan, ada sedikit perbedaan. Di sini, ada escape character \” yakni membuat yang diapit keduanya sebagai string. Ya, argumen -c itu tadi sebabnya. Kita memasukkan string ke dalam bash tetapi ia sanggup menerimanya sebagai perintah karena argumen -c. Yang paling penting, inilah model paling ringkas menggunakan QProcess untuk mengeksekusi perintah Terminal.

  • Model Eksekusi Perintah Kedua
QProcess sh;
sh.start("sh", QStringList() << "-c" << "ifconfig | grep inet");

sh.waitForFinished(-1);
QByteArray output = sh.readAll();
printf(output);

Inti dari model kedua ini adalah pemanfaatan method start() milik QProcess yang memiliki bentuk umum: start(command, argument);. Perintah kita taruh di command, argumen kita taruh di argument. Sekadar catatan, rm -rf ubuntu.png berarti rm itu perintah sedangkan -rf ubuntu.png itu argumen. Di sini, perintah yang digunakan adalah sh (pasti ada di /bin/ Anda) sedangkan argumen yang digunakan adalah -c dan ifconfig | grep inet. Istimewanya, di sini penggunaannya tidak sesederhana itu. Kita menggunakan kelas tambahan bernama QStringList di dalam argumen start(). QStringList ini adalah kelas yang bisa menampung beberapa string sekaligus. Oleh karena itu, ia dipakai untuk menampung string yang berisi argumen-argumen perintah. Ia sangat praktis, maka ia sering digunakan. Di sini, QStringList dipakai dengan deklarasi langsung QStringList() << “-c” << “ifconfig | grep inet”. Terlihat aneh, terlihat tidak biasa. Namun ini gunanya supaya kita tidak usah membuat satu objek baru.

Teristimewa untuk QByteArray output = sh.readAll(), ini maksudnya memanggil method readAll() milik objek QProcess, yang menghasilkan keluaran dari perintah yang dijalankan oleh QProcess, lalu keluaran itu disimpan pada objek output yang dibuat dari kelas QByteArray. Pendek kata, baris deklarasi ini mengambil standard output dari perintah di dalam objek QProcess. Oleh karena itu, ia akan mengeluarkan output dari perintah ifconfig | grep inet ke Terminal di dalam Qt Creator. Apakah ini tidak penting? Tidak, justru ini (standard output dan standard error) penting sekali untuk membangun aplikasi sebagaimana ditulis di paragraf pertama tulisan ini.

  • Model Eksekusi Perintah Ketiga
QStringList options;
options << "-c" << "ls -l | grep a | sort > isifolder.txt";

QProcess process;
process.start("/bin/sh", options);
process.waitForFinished(-1);

Model ketiga ini adalah yang paling mudah dipahami. Pertama-tama kita membuat objek QStringList dahulu yang menampung seluruh argumen yang dibutuhkan. Objek ini bernama options. Lalu kita buat objek QProcess yang menampung perintah /bin/sh (bisa diganti /bin/bash atau /bin/zsh jika Anda punya zsh). Objek ini bernama process. Lalu, kita panggil start(“/bin/sh”, options); untuk process. Maka jadilah program seperti yang saya tampilkan di bagian Hasil Kode di atas.

Inti dari ketiga jenis eksekusi perintah Terminal dari dalam Qt di atas adalah pemakaian kelas QProcess. Ada beberapa hal penting yang patut diperhatikan:

  1. Kita bisa menggunakan pipeline (|) dan redirection (>, <, >>, <<) setelah mereka dimasukkan sebagai string sekaligus argumen pada QProcess. Pipeline dan redirection adalah the ultimate power di sistem operasi Linux.
  2. Tidak seperti biasanya, di sini, yang disebut command itu malah /bin/bash (shell) kita bukan langsung pada command yang biasa kita ketik di Terminal. Justru command yang biasa kita pakai itu menjadi argument di sini.
  3. Adanya method waitForFinished(-1) di sini. Arti nilai -1 ini adalah menunggu sampai objek QProcess selesai mengerjakan tugasnya. Tanpa method ini, program tidak berjalan semestinya.
  4. Seluruh kode yang ada di sini adalah dasar kita untuk membuat aplikasi yang selain mampu mengeksekusi perintah Terminal, juga mampu membaca keluaran dari perintah yang dieksekusi bahkan mampu memrosesnya.

Unduh Kode Sumber

Program kali ini bernama Embrio-Metamorfosa juga. Saya menggunakan Git jadi tidak khawatir kode rusak. Silakan unduh dan buka di Qt Creator Anda.

Tautan: http://otodidak.freeserver.me/tarball/Embrio-Metamorfosa_Edisi_2.tar.gz
Ukuran: 3 KB

Kesimpulan

  • Eksekusi perintah Linux dengan Qt bisa dilakukan dengan QProcess selain dengan method system().
  • QProcess bisa dimanfaatkan untuk membaca standard output dan standard error dari segala perintah Linux.
  • Ada beberapa model eksekusi perintah Linux di dalam Qt tetapi seluruhnya tidak keluar dari bentuk umum qprocess.start(command, argument).
  • Kita beralih ke QProcess karena ia praktis dan memiliki semua perlengkapan untuk memanggil perintah Linux serta membaca dan mengolah standard output-nya.
  • Inti dari semua ini adalah pembuatan sebuah proses baru lalu proses itu memanggil perintah Linux.

Rujukan