ويدجت ها كيوت 4 بخش دوم
در اين قسمت از آموزش كيوت 4 ما بحث را درباره ويدجت هاي كيوت 4 ادامه مي دهيم.
QCheckBox
QCheckBox يك ويدجت مي باشد كه داراي دو حالت روشن و خاموش هست. آن يك جعبه همراه يك Label مي باشد. اگر چك باكس در حالت Checked باشد يك تيك درون جعبه قرار مي گيرد.
در مثال ما ، يك چكباكس در پنجره فرم نمايش مي دهيم. اگر چك باكس تيك بخورد ، يك عنوان براي پنجره نمايش داده مي شود در غير اينصورت عنوان مخفي مي ماند.
checkbox.h
#ifndef CHECKBOX_H
#define CHECKBOX_H
#include <QWidget>
class CheckBox : public QWidget
{
Q_OBJECT
public:
CheckBox(QWidget *parent = 0);
private slots:
void showTitle(int);
};
#endif
اين يك سرآيند براي كدهاي مثال ما مي باشد.
checkbox.cpp
#include "checkbox.h"
#include <QCheckBox>
CheckBox::CheckBox(QWidget *parent)
: QWidget(parent)
{
QCheckBox *cb = new QCheckBox("Show Title", this);
cb->setCheckState(Qt::Checked);
cb->move(50, 50);
connect(cb, SIGNAL(stateChanged(int)), this, SLOT(showTitle(int)));
}
void CheckBox::showTitle(int state)
{
if (state == Qt::Checked) {
setWindowTitle("QCheckBox");
} else {
setWindowTitle("");
}
}
ما Checkbox را روي پنجره نمايش داده و به اسلات shotTitle() اتصال پيدا مي كنيم.
cb->setCheckState(Qt::Checked);
زماني كه مثال شروع مي شود CheckBox تيك خوده مي باشد.
void CheckBox::showTitle(int state)
{
if (state == Qt::Checked) {
setWindowTitle("QCheckBox");
} else {
setWindowTitle("");
}
}
ما حالت CheckBox را تعيين مي كنيم و متد setWindowTitle() را بر اين اساس فرا مي خوانيم.
main.cpp
#include "checkbox.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
CheckBox window;
window.resize(250, 150);
window.move(300, 300);
window.setWindowTitle("QCheckBox");
window.show();
return app.exec();
}
فايل اصلي

تصوير: QCheckBox
QListWidget
QListWidget يك ويدجت مي باشد كه براي نمايش ليستي از آتيم ها نمايش داده مي شود.. در در اين مثال، ما نشان خواهيم داد كه چطور آيتم ها را تغيير نام دهيم يا پاك و اضافه كنيم.
listwidget.h
#ifndef LISTWIDGET_H
#define LISTWIDGET_H
#include <QWidget>
#include <QPushButton>
#include <QListWidget>
class ListWidget : public QWidget
{
Q_OBJECT
public:
ListWidget(QWidget *parent = 0);
private slots:
void addItem();
void renameItem();
void removeItem();
void clearItems();
private:
QListWidget *lw;
QPushButton *add;
QPushButton *rename;
QPushButton *remove;
QPushButton *removeAll;
};
#endif
فايل سرآيند براي اين مثال
listwidget.cpp
#include "listwidget.h"
#include <QVBoxLayout>
#include <QInputDialog>
ListWidget::ListWidget(QWidget *parent)
: QWidget(parent)
{
QVBoxLayout *vbox = new QVBoxLayout();
vbox->setSpacing(10);
QHBoxLayout *hbox = new QHBoxLayout(this);
lw = new QListWidget(this);
lw->addItem("The Omen");
lw->addItem("The Exorcist");
lw->addItem("Notes on a scandal");
lw->addItem("Fargo");
lw->addItem("Capote");
add = new QPushButton("Add", this);
rename = new QPushButton("Rename", this);
remove = new QPushButton("Remove", this);
removeAll = new QPushButton("Remove All", this);
vbox->setSpacing(3);
vbox->addStretch(1);
vbox->addWidget(add);
vbox->addWidget(rename);
vbox->addWidget(remove);
vbox->addWidget(removeAll);
vbox->addStretch(1);
hbox->addWidget(lw);
hbox->addSpacing(15);
hbox->addLayout(vbox);
connect(add, SIGNAL(clicked()), this, SLOT(addItem()));
connect(rename, SIGNAL(clicked()), this, SLOT(renameItem()));
connect(remove, SIGNAL(clicked()), this, SLOT(removeItem()));
connect(removeAll, SIGNAL(clicked()), this, SLOT(clearItems()));
setLayout(hbox);
}
void ListWidget::addItem()
{
QString item = QInputDialog::getText(this, "Item",
"Enter new item");
item = item.simplified();
if (!item.isEmpty()) {
lw->addItem(item);
int r = lw->count() - 1;
lw->setCurrentRow(r);
}
}
void ListWidget::renameItem()
{
QListWidgetItem *curitem = lw->currentItem();
int r = lw->row(curitem);
QString text = curitem->text();
QString item = QInputDialog::getText(this, "Item",
"Enter new item", QLineEdit::Normal, text);
item = item.simplified();
if (!item.isEmpty()) {
lw->takeItem(r);
delete curitem;
lw->insertItem(r, item);
lw->setCurrentRow(r);
}
}
void ListWidget::removeItem()
{
QListWidgetItem *item = lw->currentItem();
if (item) {
int r = lw->row(item);
lw->takeItem(r);
delete item;
}
}
void ListWidget::clearItems()
{
if (lw->count() != 0)
lw->clear();
}
ما يك ويدجت ليست و 4 دكمه نمايش مي دهيم. ما از اين دكمه ها براي پاك كردن ، اضافه كردن و تغيير نام از ويدجت ليست استفاده مي كنيم.
lw = new QListWidget(this);
lw->addItem("The Omen");
lw->addItem("The Exorcist");
lw->addItem("Notes on a scandal");
lw->addItem("Fargo");
lw->addItem("Capote);
QListWidget با 5 آيتم ايجاد شده است.
void ListWidget::addItem()
{
QString item = QInputDialog::getText(this, "Item",
"Enter new item");
item = item.simplified();
if (!item.isEmpty()) {
lw->addItem(item);
int r = lw->count() - 1;
lw->setCurrentRow(r);
}
}
متد addItem() يك آيتم جديد به ويدجت ليست اضافه مي كند. اين ديالوگ يك مقدار رشته اي باز مي گرداند. ما توسط متد simplified() فضاهاي خالي از رشته را پاك مي كنيم كه اگر رشته اي را بازگرداند پس آن تهي نيست ، و ما آنرا به ويدجت ليست اضافه مي كنيم.در آخر ما آيتم هاي مندرج را highlight (مشخص) مي كنيم.
void ListWidget::renameItem()
{
QListWidgetItem *curitem = lw->currentItem();
int r = lw->row(curitem);
QString text = curitem->text();
QString item = QInputDialog::getText(this, "Item",
"Enter new item", QLineEdit::Normal, text);
item = item.simplified();
if (!item.isEmpty()) {
lw->takeItem(r);
delete curitem;
lw->insertItem(r, item);
lw->setCurrentRow(r);
}
}
تغيير نام يك آيتم شامل چندين مرحله مي باشد. ابتدا با استفاده از متد currentItem() آيتم هاي جاري را دريافت مي كنيم.ما متن آيتم و سطحي را كه آيتم در آن قرار گرفته دريافت مي كنيم. متن آيتم در ديالوگ QInputDialog نمايش داده شده است. رشته اي كه از ديالوگ بازگردانده شده است توسط متد simplefied() فضاهاي خالي آن پاك شده است. سپس ما توسط متد takeItem() آيتم هاي قديمي را پاك مي كنيم و آن ها را توسط متد insertItem() جايگزين مي كنيم. در آخر يك آيتم جديد توسط setCurrentRow() انتخاب مي كنيم.
void ListWidget::removeItem()
{
QListWidgetItem *item = lw->currentItem();
if (item) {
int r = lw->row(item);
lw->takeItem(r);
delete item;
}
}
متد removeItem() آيتم هاي تعيين شده از يك ليست را پاك مي كند.. در ابتدا ، ما انتخاب هاي جاري از QListWidgetItem دريافت مي كنيم. ما با استفاده از متد takeItem() سطر جاري را انتخاب كرده و آيتم ها را پاك مي كنيم. توجه كنيد كه ما بصورت دستي QListWidgetItem را Delete مي كنيم.
void ListWidget::clearItems()
{
if (lw->count() != 0)
lw->clear();
}
متد Clear() همه آيتم ها را از ويدجت ليست پاك مي كند.
main.cpp
#include "listwidget.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
ListWidget window;
window.move(300, 300);
window.setWindowTitle("QListWidget");
window.show();
return app.exec();
}
فايل اصلي

تصوير: QListWidget
QPixmap
QPixmap يكي از ويدجت هاي براي كار با عكس (Image) مي باشد.. كه براي نمايش تصاوير روي صفحه نمايش بهينه شده است. در كد مثال ما ، ما از QPixmap براي نمايش تصاوير روي پنجره فرم استفاده مي كنيم.
pixmap.h
#ifndef PIXMAP_H
#define PIXMAP_H
#include <QWidget>
class Pixmap : public QWidget
{
public:
Pixmap(QWidget *parent = 0);
};
#endif
فايل سرآيند براي اين مثال
pixmap.cpp
#include "pixmap.h"
#include <QPixmap>
#include <QLabel>
#include <QHBoxLayout>
Pixmap::Pixmap(QWidget *parent)
: QWidget(parent)
{
QHBoxLayout *hbox = new QHBoxLayout(this);
QPixmap pixmap("bojnice.jpg");
QLabel *label = new QLabel(this);
label->setPixmap(pixmap);
hbox->addWidget(label);
setLayout(hbox);
}
ما تصويري(Image) را از يك قلعه معروف در مركز اسلواكي نمايش مي دهيم.
QPixmap pixmap("bojnice.jpg");
QLabel *label = new QLabel(this);
label->setPixmap(pixmap);
ما يك pixmap ايجاد مي كنيم و در داخل يك ويدجت ليبل قرار مي دهيم.
main.cpp
#include "pixmap.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
Pixmap window;
window.move(300, 300);
window.setWindowTitle("QPixmap");
window.show();
return app.exec();
}
فايل اصلي
QSplitter
QSplitter به ما اين اجازه را مي دهد تا اندازه ويدجت فرزندان را با كشيدن خط بين فرزندان كنترل كنيم. در مثال ما ، ما سه ويدجت QFrame با دو جدا كننده نمايش مي دهيم.
splitter.h
#ifndef SPLITTER_H
#define SPLITTER_H
#include <QWidget>
class Splitter : public QWidget
{
public:
Splitter(QWidget *parent = 0);
};
#endif
فايل سرآيند براي اين مثال
splitter.cpp
#include "splitter.h"
#include <QFrame>
#include <QSplitter>
#include <QHBoxLayout>
Splitter::Splitter(QWidget *parent)
: QWidget(parent)
{
QHBoxLayout *hbox = new QHBoxLayout(this);
QFrame *topleft = new QFrame(this);
topleft->setFrameShape(QFrame::StyledPanel);
QFrame *topright = new QFrame(this);
topright->setFrameShape(QFrame::StyledPanel);
QSplitter *splitter1 = new QSplitter(Qt::Horizontal, this);
splitter1->addWidget(topleft);
splitter1->addWidget(topright);
QFrame *bottom = new QFrame(this);
bottom->setFrameShape(QFrame::StyledPanel);
QSplitter *splitter2 = new QSplitter(Qt::Vertical, this);
splitter2->addWidget(splitter1);
splitter2->addWidget(bottom);
hbox->addWidget(splitter2);
setLayout(hbox);
}
ما سه ويدجت frame و دو ويدجت splitter داريم.
QSplitter *splitter1 = new QSplitter(Qt::Horizontal, this);
splitter1->addWidget(topleft);
splitter1->addWidget(topright);
ما يك ويدجت splitter ايجاد مي كنيم و دو ويدجت frame داخل splitter اضافه مي كنيم.
QSplitter *splitter2 = new QSplitter(Qt::Vertical, this);
splitter2->addWidget(splitter1);
ما همچنين مي توانيم splitter را به ديگر ويدجت هاي splitter اضافه كنيم.
main.cpp
#include "pixmap.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
Pixmap window;
window.move(300, 300);
window.setWindowTitle("QPixmap");
window.show();
return app.exec();
}
فايل اصلي

تصوير: QSplitter
در برخي از تم هاي دسكتاپ splitter قادر نيست تا خوب به نمايش در آيد.
QTableWidget
QTableWidget يك ويدجت منحصر به فرد مي باشد كه در برنامه هاي كابردي صفحه گسرده استفاده مي شود. برحي اوقات از اين ويدجت به عنوان ويدجت شبكه نيز استفاده مي شود. اين ويدجت يكي از پيچيده ترين ويدجت ها مي باشد. در اينجا تنها اين ويدجت را روي پنجره فرم نمايش خواهيم داد.
table.h
#ifndef TABLE_H
#define TABLE_H
#include <QWidget>
class Table : public QWidget
{
public:
Table(QWidget *parent = 0);
};
#endif
فايل سرآيند براي اين مثال
table.cpp
#include "table.h"
#include <QHBoxLayout>
#include <QTableWidget>
Table::Table(QWidget *parent)
: QWidget(parent)
{
QHBoxLayout *hbox = new QHBoxLayout(this);
QTableWidget *table = new QTableWidget(25, 25, this);
hbox->addWidget(table);
setLayout(hbox);
}
QTableWidget *table = new QTableWidget(25, 25, this);
در اينجا ما يك ويدجت table با 25 سطر و 25 ستون ايجاد خواهيم كرد.
main.cpp
#include "table.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
Table window;
window.move(300, 300);
window.setWindowTitle("QTableWidget");
window.show();
return app.exec();
}
فايل اصلي

تصوير: QTableWidget
در اين فصل ما چندين ويدجت ديگر از كتابخانه كيوت 4 را مورد بررسي قرار داديم.
پايان بخش Qt 4 Widgets II