Pemrograman Qt 21 – Multiple Window


Bismillahirrahmanirrahim.

qt-creator-logoBagaimana membuat suatu program yang memiliki banyak jendela? Jika satu tombol diklik, jendela lain terbuka. Pertanyaan ini adalah pertanyaan paling mendasar ketika saya membuat Otodidak versi 1 kemarin. Sekarang saya sudah membuat satu program kecil dengan kemampuan multiple window. Mungkin cara ini bukan yang paling efektif, tetapi setidaknya ini bisa dicoba. Pada dasarnya, teknik multiple window di sini hanyalah menempatkan deklarasi-deklarasi QMainWindow baru di dalam sebuah fungsi lalu memanggil fungsi tersebut dengan SIGNAL & SLOT. Semoga tulisan ini bermanfaat.

Spesifikasi

  1. Ubuntu 12.04
  2. Qt Creator 2.4.1
  3. Qt 4.8

Daftar Kelas

  1. QMainWindow

Daftar Method

  1. close()
  2. show()
  3. BukaJendelaBaru() (buatan sendiri)
  4. stackSatu() (buatan sendiri)
  5. stackDua() (buatan sendiri)
  6. BukaJendelaMainWindow() (buatan sendiri)

Arah Tulisan Ini

ngite-keduapuluhsatu2

Kita akan membuat jendela utama Otodidak, mirip seperti versi pertamanya. Tentu saja ini hanya sebatas prototipe, bukan proyek sungguhannya. Hanya tombol MP3 yang diberi fungsi, sedangkan tombol lain cuma hiasan. Fungsi yang diberikan adalah pembuka jendela baru yang sekaligus menutup (close) jendela utama.

ngite-keduapuluhsatu3

Setelah jendela kedua terbuka, seharusnya jendela utama tertutup. Jika tombol LAYER A diklik, maka jendela kedua ditutup dan jendela utama ditayangkan kembali. Demikianlah prinsip multiple window sederhana dari Otodidak versi 1.

Bonusnya adalah layering yakni kemampuan jendela untuk memiliki lebih dari 1 layer layout dengan memanfaatkan QStackedLayout. Jika tombol A ditekan, maka layer pertama yang ditampilkan. Jika tombol B ditekan, maka layer kedua yang ditampilkan sambil menyembunyikan layer A. Prinsip ini serupa dengan pergantian tampilan GUI pada KDE System Settings, installer aplikasi-aplikasi di Windows (yang prinsipnya next-next-next itu), dan tentu saja layering di dalam aplikasi pengolah gambar. Anda tidak difokuskan dalam implementasi prinsip ini saat ini.

ngite-keduapuluhsatu4

Kode

mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QtGui>

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);       // ini adalah konstruktor dari kelas MainWindow yang dipasangi prefiks explicit
                                                    // sumber http://stackoverflow.com/questions/121162/what-does-the-explicit-keyword-in-c-mean
                                                    // pemahaman untuk konstruktor dasar bisa dibaca di http://www.tutorialspoint.com/cplusplus/cpp_constructor_destructor.htm
                                                    // Thursday, August 21, 2014 10:33 AM

    QWidget         *widgetUtama;
    QVBoxLayout     *vboxUtama;
    QHBoxLayout     *hboxUtama;
    QToolButton     *tombolUbuntu;
    QToolButton     *tombolMP3;
    QToolButton     *tombolAplikasi;
    QToolButton     *tombolSimulatorTerminal;
    QStackedLayout  *slSatu;

    ~MainWindow();

private:
    Ui::MainWindow *ui;
    QMainWindow *jendelaKedua;

public slots:
    void BukaJendelaBaru();
    void BukaJendelaMainWindow();
    void MatikanMainWindow();
    void stackSatu();
    void stackDua();

};

#endif // MAINWINDOW_H

mainwindow.cpp

// Proyek Sebelum Proyek Otodidak
// Dibuat pada malam Id pada Sunday, July 27, 2014 10:21 PM
// Ade Malsasa Akbar <teknoloid@gmail.com> <https://malsasa.wordpress.com> <#ubuntu-indonesia@freenode>

#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    QWidget     *widgetUtama                   =       new     QWidget;
    QLabel      *labelJudulOtodidak            =       new     QLabel("Otodidak Versi 2");
    QVBoxLayout *vboxUtama                     =       new     QVBoxLayout;
    QHBoxLayout *hboxUtama                     =       new     QHBoxLayout;
    QToolButton *tombolUbuntu                  =       new     QToolButton;
    QToolButton *tombolMP3                     =       new     QToolButton;
    QToolButton *tombolAplikasi                =       new     QToolButton;
    QToolButton *tombolSimulatorTerminal       =       new     QToolButton;
    QFont        ubuntu("Ubuntu", 20, QFont::Bold, false);                       // objek khusus untuk fonta label judul Tuesday, August 19, 2014 10:29 PM

    // objek khusus untuk ikon jendela PraOtodidak Tuesday, August 19, 2014 10:56 PM
    QIcon        logootodidak(":/gambar/logootodidak");         // ternyata memang harus PNG

    // pengaturan kemampuan mekar setiap tombol (Sunday, July 27, 2014 10:57 PM)
    tombolUbuntu->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
    tombolMP3->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
    tombolAplikasi->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
    tombolSimulatorTerminal->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);

    // pengaturan ukuran minimum maksimum tombol
    //      pengaturan ukuran minimal tombol
    tombolUbuntu->setMinimumSize(99,99);
    tombolMP3->setMinimumSize(99,99);
    tombolAplikasi->setMinimumSize(99,99);
    tombolSimulatorTerminal->setMinimumSize(99,99);

    //      pengaturan ukuran maksimum tombol Tuesday, August 19, 2014 09:04 PM
    tombolUbuntu->setMaximumSize(150, 150);
    tombolMP3->setMaximumSize(150, 150);
    tombolAplikasi->setMaximumSize(150, 150);
    tombolSimulatorTerminal->setMaximumSize(150, 150);

    // pengaturan objek ikon untuk setiap tombol (Sunday, July 27, 2014 10:57 PM)
    QIcon       ikonTombolUbuntu(":/gambar/ubuntu-logo.svg");                   // semuanya svg
    QIcon       ikonTombolMP3(":/gambar/rhythmbox.svg");
    QIcon       ikonTombolAplikasi(":/gambar/synaptic.svg");
    QIcon       ikonTombolSimulatorTerminal(":/gambar/terminal.svg");

    // pengaturan gaya tombol yakni teks di bawah gambar (Sunday, July 27, 2014 10:57 PM)
    tombolUbuntu->setToolButtonStyle(Qt::ToolButtonTextUnderIcon);
    tombolMP3->setToolButtonStyle(Qt::ToolButtonTextUnderIcon);
    tombolAplikasi->setToolButtonStyle(Qt::ToolButtonTextUnderIcon);
    tombolSimulatorTerminal->setToolButtonStyle(Qt::ToolButtonTextUnderIcon);

    // pengaturan ukuran ikon tombol dengan bantuan kelas QSize (Sunday, July 27, 2014 11:06 PM)
    QSize ukuranIkonTombol(48, 48);
    tombolUbuntu->setIconSize(ukuranIkonTombol);
    tombolMP3->setIconSize(ukuranIkonTombol);
    tombolAplikasi->setIconSize(ukuranIkonTombol);
    tombolSimulatorTerminal->setIconSize(ukuranIkonTombol);

    // penempelan ikon ke dalam setiap tombol (Sunday, July 27, 2014 10:57 PM)
    tombolUbuntu->setIcon(ikonTombolUbuntu);
    tombolMP3->setIcon(ikonTombolMP3);
    tombolAplikasi->setIcon(ikonTombolAplikasi);
    tombolSimulatorTerminal->setIcon(ikonTombolSimulatorTerminal);

    // penulisan teks ke dalam setiap tombol (Sunday, July 27, 2014 10:57 PM)
    tombolUbuntu->setText("UBUNTU");
    tombolAplikasi->setText("APLIKASI");
    tombolMP3->setText("MP3");
    tombolSimulatorTerminal->setText("SIMULATOR \nTERMINAL");

    // penempelan widget-widget ke dalam layout (Sunday, July 27, 2014 10:57 PM)
    // horizontal
    hboxUtama->addWidget(tombolUbuntu);
    hboxUtama->addWidget(tombolMP3);
    hboxUtama->addWidget(tombolAplikasi);
    hboxUtama->addWidget(tombolSimulatorTerminal);

    // styling QLabel
    labelJudulOtodidak->setAlignment(Qt::AlignCenter);
    labelJudulOtodidak->setStyleSheet("QLabel { background-color : black; color : white; }");
    labelJudulOtodidak->setFont(ubuntu);
    labelJudulOtodidak->setMinimumHeight(30);

    // vboxlayout diisi dengan QLabel dan QHBoxLayout
    vboxUtama->addWidget(labelJudulOtodidak);
    vboxUtama->addLayout(hboxUtama);

    // penempelan layout pada widget utama (Sunday, July 27, 2014 10:57 PM)
    widgetUtama->setLayout(vboxUtama);

    // penempelan widget utama pada jendela utama, ditempel sebagai central widget (Sunday, July 27, 2014 10:57 PM)
    this->setCentralWidget(widgetUtama);

    //tes signal slot untuk membuka jendela baru, dibuat pada Sunday, August 17, 2014 05:21 PM
    connect(tombolMP3, SIGNAL(clicked()), this, SLOT(BukaJendelaBaru()));

    // pemasangan ikon Otodidak untuk jendela Tuesday, August 19, 2014 10:56 PM
    this->setWindowIcon(logootodidak);

}

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

// ini fungsi pembunuh jendela utama yang akan dipagnggil di dalam fungsi BukaJendelaBaru di bawah
// dikomentari pada Tuesday, August 19, 2014 10:44 PM
void MainWindow::MatikanMainWindow()
{
    // kalau mau beraksi seperti Otodidak versi 1*), fungsi yang dipakai bukan destroy tetapi close
    // ternyata tidak ada perubahan
    // dikomentari pada Sunday, August 17, 2014 05:30 PM
    // *) https://malsasa.wordpress.com/2013/02/24/otodidak-versi-1-dirilis/
    this->close();
}

// ===================FUNGSI KEDUA================== //
// fungsi khusus pembuat jendela kedua
// dikomentari pada Monday, August 18, 2014 08:21 PM
void MainWindow::BukaJendelaBaru()
{
    // deklarasi pembuatan objek jendela baru
    jendelaKedua = new QMainWindow;

    QPushButton *tombolA      = new QPushButton("INI ADALAH AKU");
    QPushButton *tombolB      = new QPushButton("INI ADALAH DIA");
    QVBoxLayout *layoutLayerA = new QVBoxLayout;
    QVBoxLayout *layoutLayerB = new QVBoxLayout;
    QPushButton *tombolLayerA = new QPushButton("LAYER A");
    QPushButton *tombolLayerB = new QPushButton("LAYER B");
    QWidget     *widgetA      = new QWidget;
    QWidget     *widgetB      = new QWidget;
    QWidget     *widgetC      = new QWidget;

    // pengaturan ukuran tombol untuk jendela kedua
    // Monday, August 18, 2014 08:22 PM
    tombolA->setMinimumSize(66,55);
    tombolB->setMinimumSize(66,55);

    // tombol di dalam layer-layer dibuat lebih besar daripada tombol penggesernya
    // dikomentari pada Monday, August 18, 2014 08:23 PM
    tombolLayerA->setMinimumSize(166,155);
    tombolLayerB->setMinimumSize(166,155);

    // percobaan QStackedLayout
    slSatu    = new QStackedLayout;

    widgetA->setLayout(layoutLayerA);
    widgetB->setLayout(layoutLayerB);

    layoutLayerA->addWidget(tombolLayerA);
    layoutLayerB->addWidget(tombolLayerB);

    // urusi widget Monday, August 18, 2014 12:52 AM
    slSatu->addWidget(widgetA);
    slSatu->addWidget(widgetB);

    // pembuatan layout dasar untuk menampung stacked layout dan widget lainnya
    // dikomentari pada Monday, August 18, 2014 08:04 PM
    QVBoxLayout     *layoutA    =   new     QVBoxLayout;

    // pemasangan stacked layout ke dalam layout normal dilakukan dengan hanya addLayout() bukan dengan membuat QWidget baru
    // dengan cara ini, penghematan widget dan layout bisa dilakukan
    // sehingga bisa dilakukan di dalam suatu QVBoxLayout penambahan layout sekaligus penambahan widget tanpa banyak QWidget baru
    // Monday, August 18, 2014 08:03 PM
    layoutA->addLayout(slSatu);
    layoutA->addWidget(tombolA);
    layoutA->addWidget(tombolB);
    widgetC->setLayout(layoutA);

    jendelaKedua->setCentralWidget(widgetC);
    jendelaKedua->showNormal();

    // fungsi ini bertugas mematikan jendela utama
    MainWindow::MatikanMainWindow();

    // berhasil!
    // pergeseran layer bisa dilakukan dengan memasang slot satu fungsi tunggal
    // fungsi eksternal yang dibuat di luar fungsi pembuat jendela BukaJendelaBaru()
    // bukan dengan cara memanggil slSatu->setCurrentIndex(int nomor) sebagai argumen SLOT
    // Monday, August 18, 2014 08:00 PM
    connect(tombolA, SIGNAL(clicked()), this, SLOT(stackSatu()));
    connect(tombolB, SIGNAL(clicked()), this, SLOT(stackDua()));

    connect(tombolLayerA, SIGNAL(clicked()), this, SLOT(BukaJendelaMainWindow()));

}

// berhasil!
// untuk melakukan pergantian layer, harus dibuat fungsi penggeser layer terpisah dari fungsi pembuat jendela
// tidak dijadikan satu dalam fungsi pembuat jendela
// objek stack layout harus dideklarasikan dalam kelas yang sama dengan MainWindow utama, bukan dengan membuat kelas baru di mainwindow.h
// oleh karena itu, slSatu bisa dipanggil dari sini
// Monday, August 18, 2014 07:58 PM
void MainWindow::stackSatu()
{
    slSatu->setCurrentIndex(0);
}

void MainWindow::stackDua()
{
    slSatu->setCurrentIndex(1);
}

// fungsi pemanggil jendela utama sekaligus pembunuh jendela kedua
// Monday, August 18, 2014 08:15 PM
void MainWindow::BukaJendelaMainWindow()
{
    // fungsi sederhana untuk menayangkan jendela utama kembali setelah matinya
    // tidak usah berpikir susah MainWindow::? atau apalah
    // Monday, August 18, 2014 08:13 PM
    this->show();

    // fungsi pembunuh jendela kedua
    jendelaKedua->close();
}

Qt Creator dan Kode

ngite-keduapuluhsatu1

Hasil

ngite-keduapuluhsatu2

praotodidak1

praotodidak2

Analisis

Saya akan memberikan analisis untuk bagian yang terpenting saja. Bagian paling penting di sini adalah fungsi BukaJendelaBaru() dan MatikanMainWindow() kemudian fungsi BukaJendelaMainWindow(). Tujuan dari dua fungsi ini adalah membuka dan menutup kedua jendela, secara bergantian. Cara ini dipakai di Otodidak versi 1. Setelah fungsi pergantian jendela, hal yang penting lagi adalah fungsi pergantian layer di dalam jendela kedua, untuk mengganti tampilan satu jendela dari satu tampilan ke tampilan yang berbeda. Ini dilakukan dengan fungsi stackSatu() dan stackDua().

1. Fungsi BukaJendelaBaru() dan MatikanMainWindow()

Bagian terpenting di dalam fungsi BukaJendelaBaru() adalah 2 baris kode

jendelaKedua = new QMainWindow;

jendelaKedua->setCentralWidget(widgetC);

Intinya, fungsi BukaJendelaBaru() ini bertugas membuka jendela baru dan menutup jendela MainWindow. Maksud 2 baris kode di atas adalah membuat satu MainWindow baru bernama jendelaKedua lalu mengisinya dengan widgetC sebagai central widget. Sedangkan penutupan jendela MainWindow dilakukan oleh fungsi MainWindow::MatikanMainWindow();. Fungsi MatikanMainWindow() ini hanya berisi this->close() yang mirip sekali dengan Otodidak versi 1, this->dispose().

2. Fungsi BukaJendelaMainWindow()

Fungsi ini sebagaimana namanya, bertugas menghidupkan kembali jendela MainWindow setelah matinya. Bagian terpentingnya adalah sebaris kode

this->show();

Yang bertujuan menghidupkan kembali MainWindow yang mati. Sangat sederhana.Tentu, setelah MainWindow ditayangkan kembali, jendela kedua harus mati. Dan itu dilakukan dengan sebaris kode

jendelaKedua->close();

3. Fungsi stackSatu() dan stackDua()

Fungsi ini sebetulnya hanya pembawa fungsi setCurrentIndex() untuk objek QStackedLayout. Jika diubah parameter angkanya, maka layer di dalam QStackedLayout akan berubah juga. Persis layer di GIMP. Fungsi ini disambungkan dengan tombol-tombol milik jendelaKedua di dalam fungsi sebelumnya, yakni BukaJendelaBaru().

Pertama-tama, dibuat dulu SIGNAL and SLOT di dalam jendelaKedua.

connect(tombolA, SIGNAL(clicked()), this, SLOT(stackSatu()));

connect(tombolB, SIGNAL(clicked()), this, SLOT(stackDua()));

Kemudian, dibuatlah fungsi-fungsi lain di luar yang bernama stackSatu() dan stackDua().


void MainWindow::stackSatu()

{

slSatu->setCurrentIndex(0);

}

void MainWindow::stackDua()

{

slSatu->setCurrentIndex(1);

}

Kesimpulan

  1. Pembuatan sistem ganti jendela bisa dilakukan dengan mendeklarasikan objek MainWindow baru di fungsi baru. Ini akan membuat satu jendela baru yang siap diisi widget.
  2. Penutupan jendela dilakukan dengan this->close() bukan this->destroy().
  3. Penayangan kembali jendela dilakukan dengan this->show().

Unduh Kode Sumber

17 thoughts on “Pemrograman Qt 21 – Multiple Window

  1. imamurafadorux

    Asallamualaikum, Ka Akbar
    ka
    QStackedlayout dimana? adanya Qstacked widget, saya menggunakan qt.5.2 ..
    saya membuat program gui kecil-kecilan dalam bentuk notepad. Ka, untuk fungsi replace didalam notepad itu gimana analogi kode programnya di qt.. saya bingung
    Mohon bantuannya, kak .. Terima kasih

    email: fadorux@gmail.com

    Balas
    1. Ade Malsasa Akbar Penulis Tulisan

      Wah, Kang Imam sudah pakai Qt5. Saya masih pakai Qt4. Saran saya, akang baca Qt Reference di situs aslinya (bisa jadi QStackedLayout udah dihilangkan di Qt5). Di sana udah ada contoh program Notepad persis yang akang maksud. Coba akang ambil saja.

      Balas
      1. imamurafadorux

        Terima kasih, sudah sediakalanya meluangkan waktu untuk membalas komentar saya.. Ka Akbar
        begini kak, disini http://doc.qt.digia.com/qt-5.2/gettingstartedqt.html itu contoh program notepad yang mungkin kak akbar maksud.. saya sudah cari-cari tentang bagaimana cara menambahkan tools “find dan replace” dalam pemograman qt, belum ketemu2,. kak apa yang saya maksud.. semoga Kak Akbar bisa membantu saya,. maaf! saya hanya pemula yang mencoba dan gagal.. ku mohon bantu saya.. dimana lagi saya dapat bertanya dalam bahasa sama,. tanah air sama,. negara sama, bendera sama..
        terima kasih :)

      2. Ade Malsasa Akbar Penulis Tulisan

        Masalahnya, saya belum pernah mrogram khusus find and replace. Coba akang cari program find replace di sana juga. Lalu coba gabungkan saja. Saya pribadi kalau bertanya, selalu dalam Bahasa Inggris ke luar negeri. Di Indonesia, saya tidak bertanya.

      3. imamurafadorux

        terima kasih, kak
        atas pencerahannya..
        kak
        misal saya buat multiple windows seperti kakak diatas.. dari design dulu
        mainwindows.ui
        apa yang harus pertama dilakukan? benarkah urutan saya
        1.drag&drop tombol pushbotton A dan B QHBox layout
        2.drag&drop Qstackedwidget
        3.drag&drop frame di masing2 qstackedwidget
        4.drag&drop 2 qlabel A dan B didlm 2frame qstackedwidget
        -saya sudah mencoba untuk menghubungkan (dg klik kanan go to slot) push A dan Qstackedwidget biasanya Qcurrent index 0 dan 1 .. Current index 0 dan 1 = A dan B
        kak, saya memahami bahwa itu tidak mungkin, pasti error
        menurut kakak, bagaimana caranya menghubungkan qpushbutton dengan q stacked widget?
        bisakah hal itu diberitahu.. terima kasih :)

      4. Ade Malsasa Akbar Penulis Tulisan

        Waduh, mohon maaf, Kang. Saya tidak mengerti sama sekali jika akang menggunakan drag and drop. Hard coding saja. Tulis kode dari nol. Lain dengan yang lain, dengan Qt, hard coding mudah sekali.

      5. imamurafadorux

        beruntung saya bisa kesini,. terima kasih,. kak
        lagi2 saya dikasih pencerahan.. alhamdulillah :)
        kak, bisakah kakak
        kasih referensi tentang hard coding di qt, atau mungkin kayaknya di qt seperti c++
        saya kebingungan, kak
        contoh program multiple window dari forum qt:
        $$header:

        #ifndef MAINWINDOW_H
        #define MAINWINDOW_H

        #include
        #include
        #include
        #include
        #include
        #include
        #include

        namespace Ui {
        class MainWindow;
        }

        class MainWindow : public QMainWindow
        {
        Q_OBJECT

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

        QPushButton *ButtonA;
        QPushButton *ButtonB;

        QComboBox *Combo[3];
        QLineEdit *LineEdit[3];
        QLabel *Label[3];

        QGridLayout *MainLayout;
        QStackedWidget *StackedWidget[3][2];

        private slots:

        void on_ButtonAclick();
        void on_ButtonBclick();

        private:
        Ui::MainWindow *ui;
        };

        #endif // MAINWINDOW_H

        $$ main

        #include “mainwindow.h”
        #include “ui_mainwindow.h”

        MainWindow::MainWindow(QWidget *parent) :
        QMainWindow(parent),
        ui(new Ui::MainWindow)
        {
        ui->setupUi(this);

        ButtonA = new QPushButton(“A”);
        ButtonB = new QPushButton(“B”);

        connect(ButtonA,SIGNAL(clicked()),this,SLOT(on_ButtonAclick()));
        connect(ButtonB,SIGNAL(clicked()),this,SLOT(on_ButtonBclick()));\

        MainLayout = new QGridLayout;

        Combo[0] = new QComboBox();
        Combo[0]->addItem(“Top Box”);
        Combo[1] = new QComboBox();
        Combo[1]->addItem(“Middle Box”);
        Combo[2] = new QComboBox();
        Combo[2]->addItem(“Bottom Box”);

        Label[0] = new QLabel(“Top”);
        Label[1] = new QLabel(“Middle”);
        Label[2] = new QLabel(“Bottom”);

        LineEdit[0] = new QLineEdit;
        LineEdit[1] = new QLineEdit;
        LineEdit[2] = new QLineEdit;

        for(int i=0;i<3;i++)
        for(int j=0;jaddWidget(new QLabel(“Welcome”));
        StackedWidget[1][0]->addWidget(new QLabel(“”));
        StackedWidget[2][0]->addWidget(new QLabel(“”));
        StackedWidget[0][1]->addWidget(new QLabel(“”));
        StackedWidget[1][1]->addWidget(new QLabel(“”));
        StackedWidget[2][1]->addWidget(new QLabel(“”));

        for(int i=0;iaddWidget(Label[i]);
        StackedWidget[i][1]->addWidget(LineEdit[i]);
        }

        for(int i=0;iaddWidget(Combo[i]);

        MainLayout->addWidget(ButtonA,0,2);
        MainLayout->addWidget(ButtonB,1,2);
        for(int i=0;i<3;i++)
        for(int j=0;jaddWidget(StackedWidget[i][j],i,j);

        ui->centralWidget->setLayout(MainLayout);
        }

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

        void MainWindow::on_ButtonAclick()
        {
        for(int i=0;i<3;i++)
        for(int j=0;jsetCurrentIndex(1);
        }

        void MainWindow::on_ButtonBclick()
        {
        for(int i=0;isetCurrentIndex(2);
        StackedWidget[i][1]->setCurrentIndex(0);
        }
        }

        — pertanyaannya? apa yang dimaksud atau yang dipanggil dari fungsi ini for(int i=0;i<3;i++)
        for(int j=0;j<2;j++)
        yang diatas itu berapa stacked widget kak?
        untuk signal : slot itu gimana?
        dan apa yang dimaksud fungsi [i][0] / [ ]

        terim kasih, kak :)

  2. imamurafadorux

    beruntung saya bisa kesini,. terima kasih,. kak
    lagi2 saya dikasih pencerahan.. alhamdulillah :)
    kak, bisakah kakak

    kasih referensi tentang hard coding di qt, atau mungkin kayaknya di qt seperti c++
    saya kebingungan, kak
    contoh program multiple window dari forum qt:
    $$header:

    #ifndef MAINWINDOW_H
    #define MAINWINDOW_H

    #include
    #include
    #include
    #include
    #include
    #include
    #include

    namespace Ui {
    class MainWindow;
    }

    class MainWindow : public QMainWindow
    {
    Q_OBJECT

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

    QPushButton *ButtonA;
    QPushButton *ButtonB;

    QComboBox *Combo[3];
    QLineEdit *LineEdit[3];
    QLabel *Label[3];

    QGridLayout *MainLayout;
    QStackedWidget *StackedWidget[3][2];

    private slots:

    void on_ButtonAclick();
    void on_ButtonBclick();

    private:
    Ui::MainWindow *ui;
    };

    #endif // MAINWINDOW_H

    $$ main

    #include “mainwindow.h”
    #include “ui_mainwindow.h”

    MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
    {
    ui->setupUi(this);

    ButtonA = new QPushButton(“A”);
    ButtonB = new QPushButton(“B”);

    connect(ButtonA,SIGNAL(clicked()),this,SLOT(on_ButtonAclick()));
    connect(ButtonB,SIGNAL(clicked()),this,SLOT(on_ButtonBclick()));\

    MainLayout = new QGridLayout;

    Combo[0] = new QComboBox();
    Combo[0]->addItem(“Top Box”);
    Combo[1] = new QComboBox();
    Combo[1]->addItem(“Middle Box”);
    Combo[2] = new QComboBox();
    Combo[2]->addItem(“Bottom Box”);

    Label[0] = new QLabel(“Top”);
    Label[1] = new QLabel(“Middle”);
    Label[2] = new QLabel(“Bottom”);

    LineEdit[0] = new QLineEdit;
    LineEdit[1] = new QLineEdit;
    LineEdit[2] = new QLineEdit;

    for(int i=0;i<3;i++)
    for(int j=0;jaddWidget(new QLabel(“Welcome”));
    StackedWidget[1][0]->addWidget(new QLabel(“”));
    StackedWidget[2][0]->addWidget(new QLabel(“”));
    StackedWidget[0][1]->addWidget(new QLabel(“”));
    StackedWidget[1][1]->addWidget(new QLabel(“”));
    StackedWidget[2][1]->addWidget(new QLabel(“”));

    for(int i=0;iaddWidget(Label[i]);
    StackedWidget[i][1]->addWidget(LineEdit[i]);
    }

    for(int i=0;iaddWidget(Combo[i]);

    MainLayout->addWidget(ButtonA,0,2);
    MainLayout->addWidget(ButtonB,1,2);
    for(int i=0;i<3;i++)
    for(int j=0;jaddWidget(StackedWidget[i][j],i,j);

    ui->centralWidget->setLayout(MainLayout);
    }

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

    void MainWindow::on_ButtonAclick()
    {
    for(int i=0;i<3;i++)
    for(int j=0;jsetCurrentIndex(1);
    }

    void MainWindow::on_ButtonBclick()
    {
    for(int i=0;isetCurrentIndex(2);
    StackedWidget[i][1]->setCurrentIndex(0);
    }
    }

    — pertanyaannya? apa yang dimaksud atau yang dipanggil dari fungsi ini for(int i=0;i<3;i++)
    for(int j=0;j<2;j++)
    yang diatas itu berapa stacked widget kak?
    untuk signal : slot itu gimana?
    dan apa yang dimaksud fungsi [i][0] / [ ]

    terim kasih, kak :)

    Balas
  3. Ahmad Arief

    Wah, mas… saya baru ngeh kalau ini dibuat pakai QT. Kemarin2 baru mau install QT nya soalnya, belum masuk ke tahap koding. Kemungkinan nantinya bakal sering diskusi kita mas masalah QT (baca: saya banyak tanya masalah QT)…. :-)

    Salute!… :-)

    Balas
      1. Ahmad Arief

        Ow,… saya masih programmer pemula mas Malsasa. Baru belajar programming di Linux. :-)
        Sementara ini saya pakai Qt Creator aja dulu. Kalau sudah secara team, baru pakai Framework. ;-)

      2. Ahmad Arief

        Belum jadi itu mas, kalau mau liihat yang sudah jadi yang versi Windows. Saya buat pakai VB6. Ndak bisa jalan di Linux. Tapi coba aja pakai Wine kalau mau.
        Bagus tidaknya software bukan dilihat dari tampilan, tapi dari kegunaan. :-)

Dilarang menggunakan emotikon

Isikan data di bawah atau klik salah satu ikon untuk log in:

Logo WordPress.com

You are commenting using your WordPress.com account. Logout / Ubah )

Gambar Twitter

You are commenting using your Twitter account. Logout / Ubah )

Foto Facebook

You are commenting using your Facebook account. Logout / Ubah )

Foto Google+

You are commenting using your Google+ account. Logout / Ubah )

Connecting to %s