Bismillahirrahmanirrahim.
Bagaimana 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
- Ubuntu 12.04
- Qt Creator 2.4.1
- Qt 4.8
Daftar Kelas
- QMainWindow
Daftar Method
- close()
- show()
- BukaJendelaBaru() (buatan sendiri)
- stackSatu() (buatan sendiri)
- stackDua() (buatan sendiri)
- BukaJendelaMainWindow() (buatan sendiri)
Arah Tulisan Ini
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.
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.
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
Hasil
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
- Pembuatan sistem ganti jendela bisa dilakukan dengan mendeklarasikan objek MainWindow baru di fungsi baru. Ini akan membuat satu jendela baru yang siap diisi widget.
- Penutupan jendela dilakukan dengan this->close() bukan this->destroy().
- Penayangan kembali jendela dilakukan dengan this->show().
Unduh Kode Sumber
- Alamat: http://otodidak.freeserver.me/tarball/PraOtodidak.tar.gz
- Ukuran: 100 KB






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
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.
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 :)
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.
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 :)
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.
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 :)
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 :)
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!… :-)
Prpgramer harus mampu membedakan antara Qt Framework dengan Qt Creator.
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. ;-)
Mungkin akang belum paham maksud kami.
Qt adalah framework, Qt Creator adalah IDE. Keduanya berbeda dan sepatutnya dibedakan. Menggunakan Qt Creator pasti otomatis menggunakan Qt Framework.
Akang sebaiknya mengambil referensi: http://en.wikipedia.org/wiki/Software_framework.
OK mas Malsasa. Thx infonya. Yang saya gunakan sementara ini Qt Creator. Masih dalam tahap disain Menu Utama. Kebetulan untuk aplikasi sekolah. Soalnya sebentar lagi anak saya masuk sekolah, mungkin pertengahan tahun ini. Siapa tahu bisa sambil menawarkan aplikasi tersebut ke sekolah barunya. :-)
Berikut Capturenya:
https://borneomediablog.files.wordpress.com/2015/01/qc.png
Aplikasi yang sangat bagus. Sudah terlihat keren dari sini.
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. :-)
Setahu saya ada disiplin ilmu sendiri yang membahas bagusnya software dari antarmukanya. Yakni HCI, terkhusus dalam pembahasan UI dan UX.
Programer harus mampu membedakan antara Qt Framework dengan Qt Creator.