Saqlangan fayllarning orasida MyGuiProject exe nomli faylni topishingiz


Qt dokumentatsiyasida `QMainWindow` va `QApplication` sinflari uchun quyidagi tavsiflar mavjud


Download 22.06 Kb.
bet2/2
Sana20.11.2023
Hajmi22.06 Kb.
#1788754
1   2
Bog'liq
qt hujjatlaridan

3 Qt dokumentatsiyasida `QMainWindow` va `QApplication` sinflari uchun quyidagi tavsiflar mavjud:

1. `QMainWindow` sinfi:

`QMainWindow`, asosiy oynalarning (`QWidget`) kengaytirilgan versiyasini taqdim etadi. Ushbu sinf asosiy oynalar va menularning joylashishi, tezkor tugmalar, orqa fonlar va boshqa xususiyatlarni o'z ichiga oladi. `QMainWindow`, oddiy oynaning o'rniga bo'lgan qo'shimcha funksiyalar va ko'rinishlarni taqdim etadi.

`QMainWindow` sinfi, har bir GUI ilovasi uchun asosiy oynani ko'rsatish uchun kerak bo'lgan imkoniyatlarni taqdim etadi. Ushbu sinf, foydalanuvchiga yordam berish uchun asosiy oyna yaratish, oyna ustida qismiy joylashuvlar (widgets) joylashtirish va boshqalar bilan kommunikatsiya qilish imkonini beradi.

`QMainWindow` sinfi, `QWidget` sinfindan meros olganligi uchun uning barcha funksiyalarini ham o'z ichiga oladi.

2. `QApplication` sinfi:

`QApplication`, Qt asosiy ilovasini boshqarish uchun kerak bo'lgan obyekt. Bu sinf, barcha GUI ilovalarining to'plamini boshqarish uchun yaratiladi. `QApplication` obyekti, ilova tugagandan so'ng dastur paydo bo'lgan va ishga tushirilganida ilovaning to'liq qayta-qayta ishlayotganidan hamdardan foydalanadi.

`QApplication` sinfi, dastur ichidagi har bir grafik interfeys elementi (GUI elementi) uchun muhim hisoblanadi. Ushbu sinf, ilovaga grafik interfeysni ishga tushirish, boshlash va to'xtatish, bir nechta oynalarni ishga tushirish, ilovadan chiqish vaqtini belgilash kabi muhim vazifalarni bajarish imkonini beradi.

`QApplication` sinfi, `QCoreApplication` sinfiga asoslanganligi tufayli barcha umumiy funksiyalarini ham o'z ichiga oladi. Bu esa, CLI (command line interface) ilovalar uchun ham `QApplication` sinfini qo'llab-quvvatlaydi.

12.1.Quyidagi kodda `Person` sinfi va `main` funksiyasi mavjud bo'lgan Bo'sh Qt konsol loyihasini yaratish:

```cpp
#include


#include

class Person {


public:
QString name;
QString phoneNumber;
QString address;

friend QDebug operator<<(QDebug debug, const Person &person) {


QDebugStateSaver saver(debug);
debug.nospace() << "Name: " << person.name << ", "
<< "Phone Number: " << person.phoneNumber << ", "
<< "Address: " << person.address;
return debug;
}
};

int main(int argc, char *argv[]) {


QCoreApplication a(argc, argv);

Person person;


person.name = "John Doe";
person.phoneNumber = "123-456-7890";
person.address = "1234 Main St, City";

qDebug() << person;

return a.exec();
}
```

Bu kod `Person` sinfini yaratadi, uchta maydon bilan (ism, telefon raqami va manzil) va `operator<<` metodini o'z ichiga oladi. `operator<<` metodida `QDebug` ob'ekti va `const Person&` ob'ekti qabul qilinadi. Metodning vazifasi `QDebug` ob'ekti orqali `Person` ob'ektini konsolga chiqarishni amalga oshirishdir.

`main` funksiyasi obyektni yaratadi, uning maydonlarini to'ldiradi va `qDebug()` funksiyasini ishlatib `Person` ob'ektini konsolga chiqaradi. `qDebug()` funksiyasi `operator<<` metodini chaqiradi.

Loyihani kompilyatsiya qilish uchun, `qmake` va `make` dasturlaridan foydalanishingiz mumkin. Kompilyatsiya qilish uchun quyidagi qadamllarni bajarishingiz kerak:

1. Loyiha faylini `main.cpp` nomi bilan saqlang.
2. Terminal (komand qatori) oching va loyihaning fayl joylashuvi (Working directory) papkasiga o'ting.
3. Quyidagi qatorlarni kiriting:

```bash
qmake -project


qmake
make
```

Bu qatorlar `main.cpp` fayl uchun `pro` faylini yaratadi, keyin `Makefile` yaratadi va kompilyatsiya qiladi.


4. Komandlar to'g'ri ishlayotgan bo'lsa, loyiha muvaffaqiyatli ravishda kompilyatsiya qilinadi.
5. Kompilyatsiya yakunlanganida, fayl joylashuvi (Working directory) papkada `Makefile` va `main` nomli fayllarni ko'rasiz.
6. `./main` buyrug'i orqali kompilyatsiya natijasini ishga tushiring va konsolda ma'lumotlarni ko'rasiz.

Ahamiyatli, men sizga Qt konsol loyihasini yaratishni va uni kompilyatsiya qilishni ko'rsatayman. Person sinfi uchun Ism, Telefon raqami, va Manzil maydonlarini konsolga chiqarish uchun oqim operatorini aniqlaymiz.

Quyidagi kod orqali Qt konsol loyihasini yaratamiz:

```cpp
#include


#include

class Person


{
public:
QString name;
QString phoneNumber;
QString address;
};

QDebug operator<<(QDebug debug, const Person& person)


{
QDebugStateSaver saver(debug);
debug.nospace() << "Person(Name: " << person.name << ", Phone Number: " << person.phoneNumber
<< ", Address: " << person.address << ")";
return debug;
}

int main(int argc, char *argv[])


{
QCoreApplication a(argc, argv);

Person person;


person.name = "John Doe";
person.phoneNumber = "1234567890";
person.address = "123 Main St";

qDebug() << person;

return a.exec();
}
```

Bu koddagi `Person` sinfi `name`, `phoneNumber`, va `address` maydonlariga ega bo'ladi. `QDebug` sinfi uchun oqim operatori `operator<<` ni aniqlaymiz, u `Person` obyektini konsolga chiqarishda foydalaniladi.

`main` funksiyasida `Person` obyekti yaratiladi va uning maydonlari qiymatlar bilan to'ldiriladi. Keyin `qDebug()` yordamida `person` obyekti konsolga chiqariladi.

Kodni kompilyatsiya qilish uchun Qt Creator-da "Build" tugmasini bosing yoki menyudan "Build"ni tanlang. Xato yo'q bo'lsa, "Run" tugmasini bosing yoki menyudan "Run"ni tanlang.

Natijada biz konsolda quyidagi kabi chiqishni ko'rishimiz mumkin:

```
Person(Name: John Doe, Phone Number: 1234567890, Address: 123 Main St)


```
2. Sizga matn faylga yorliq qilish va matn fayliga yozish uchun bir C++ dasturini ko'rsatishim mumkin. Quyidagi kodning oddiy qismi QFile va QTextStream sinflaridan foydalanadi:

```cpp
#include


#include

void yorliqlash_va_yozish(const QString& matn, const QString& fayl_manzili) {


// QFile obyekti yaratish
QFile fayl(fayl_manzili);

// Faylni yozish rejimida ochish


if (fayl.open(QIODevice::WriteOnly | QIODevice::Text)) {
// QTextStream obyekti bilan faylga yozish uchun bog'lanish
QTextStream out(&fayl);

// Matnni yorliqlash va faylga yozish


out << matn;

// Faylni yopish


fayl.close();

qDebug() << "Matn faylga muvaffaqiyatli yozildi.";


} else {
qDebug() << "Faylni ochishda xatolik yuz berdi.";
}
}

int main() {


QString matn = "Bu matn faylga yozilgan.";
QString fayl_manzili = "C:/matn_fayli.txt";

yorliqlash_va_yozish(matn, fayl_manzili);

return 0;
}
```

Bu dastur matn fayliga yoziladigan oddiy bir funksiyani ifodalaydi. `yorliqlash_va_yozish` funksiyasiga matn va fayl manzili beriladi. Ushbu funksiya faylni yozish rejimida ochadi, matnni yorliqlash qilib faylga yozadi va faylni yopadi. Agar faylni ochishda xatolik yuz berilsa, dastur xatolik haqida bildirish beradi. Aks holda, "Matn faylga muvaffaqiyatli yozildi." xabarini chiqaradi.

Kodingizda matn faylining manzili (`fayl_manzili`) "C:/matn_fayli.txt" sifatida qat'iy kodlangan. Siz uni o'zgartirib, matn faylining hohlagan joyida joylashtiring. Shuningdek, matnning o'zgartirilgan versiyasini ham `matn` o'zgaruvchisida belgilashingiz mumkin.

Bu dastur QT kitobxonasida ishlash uchun qurilgan. Qo'llanuvchilariga matn faylga yozilishi haqida ma'lumot olish uchun `QDebug`dan foydalanildi. Agar sizda `QDebug` mavjud bo'lmasa, o'rniga standart `cout` obyekti yoki boshqa xatoliklarni topish uchun istalgan boshqa usulni qo'llashingiz mumkin.


3. Asagida, Qt yordamida bir matn faylidan jadval qiymatlarini o'rganuvchi va bu qiymatlarni konsola yozgan bir C++ dasturi mavjud. Dastur QFile va QTextStream sinflaridan foydalanadi:

```cpp
#include


#include
#include
#include

void qiymatlarniOqish(const QString& faylManzili) {


QFile fayl(faylManzili);

if (fayl.open(QIODevice::ReadOnly | QIODevice::Text)) {


QTextStream in(&fayl);

while (!in.atEnd()) {


QString satr = in.readLine();
QStringList qiymatlar = satr.split('\t');

for (const QString& qiymat : qiymatlar) {


qDebug() << qiymat;
}
}

fayl.close();

qDebug() << "Qiymatlar muvaffaqiyatli o'qildi.";
} else {
qDebug() << "Faylni ochishda xatolik yuz berdi: " << fayl.errorString();
}
}

int main(int argc, char *argv[]) {


QCoreApplication app(argc, argv);

QString faylManzili = "C:/jadvalli_fayl.txt";


qiymatlarniOqish(faylManzili);

return app.exec();


}
```

Bu programma, bir matn dosyasidan jadval shaklidaki okur va qiymatlari konsola yozdirir. qiymatlarniOqishfonksiyonuna fayl yo'li ( faylManzili) vererek, faylni o'qish modunda ochadi. Keyin, QTextStreamile faylga ulanadi va har bir satri okur. Her satırı sekme karakterine ( '\t') göre böler ve elde edilen qiymat konsola yozdirir.


Koddaki matnning yo'li ( faylManzili), "C:/jadvalli_fayl.txt" shaklida kesin bir tarzda belgilandi. Dosyaning joylashgan joyiga uygun bir yo'l belgilab olishingiz mumkin.
Dastur, dosyayi muvaffaqiyatyla okursa "Qiymatlar muvaffaqiyat o'qildi." xabarini ko'ring. Dosya ochilamazsa, "Faylni ochishda xatolik yuz berdi." xabarini va tegishli xato tushuntirishlarini ko'rish. Bu holatda dasturini sonlandırır.
Kodda QCoreApplicationyordamida bir Qt dasturi ishga tushiriladi va app.exec()dastur ishga tushiriladi. Bu, Qt olay aylanishining ishlashini ta'minlaydi.
13.1. Aşağıda, Qt yordamida bir hesap mashinasi dasturini yaratgan bir C++ dasturi berilgan. Bu hisob mashinasi yig'ish, chiqarish, çarpma va bölme jarayonlari uchun tugmalar beradi.

```cpp
#include


#include
#include
#include
#include

int main(int argc, char *argv[]) {


QApplication app(argc, argv);

QWidget *window = new QWidget();


window->setWindowTitle("Hesap Makinesi");

QLineEdit *lineEdit = new QLineEdit();


lineEdit->setReadOnly(true);
lineEdit->setAlignment(Qt::AlignRight);
lineEdit->setFixedHeight(40);

QGridLayout *gridLayout = new QGridLayout();


gridLayout->setSpacing(2);

QPushButton *buttons[16];


QString buttonLabels[16] = {"7", "8", "9", "/",
"4", "5", "6", "*",
"1", "2", "3", "-",
"0", ".", "=", "+"};

for (int i = 0; i < 16; i++) {


buttons[i] = new QPushButton(buttonLabels[i]);
buttons[i]->setFixedSize(40, 40);
gridLayout->addWidget(buttons[i], i / 4, i % 4);
}

QObject::connect(buttons[0], &QPushButton::clicked, [=]() { lineEdit->insert("7"); });


QObject::connect(buttons[1], &QPushButton::clicked, [=]() { lineEdit->insert("8"); });
QObject::connect(buttons[2], &QPushButton::clicked, [=]() { lineEdit->insert("9"); });
QObject::connect(buttons[3], &QPushButton::clicked, [=]() { lineEdit->insert("/"); });
QObject::connect(buttons[4], &QPushButton::clicked, [=]() { lineEdit->insert("4"); });
QObject::connect(buttons[5], &QPushButton::clicked, [=]() { lineEdit->insert("5"); });
QObject::connect(buttons[6], &QPushButton::clicked, [=]() { lineEdit->insert("6"); });
QObject::connect(buttons[7], &QPushButton::clicked, [=]() { lineEdit->insert("*"); });
QObject::connect(buttons[8], &QPushButton::clicked, [=]() { lineEdit->insert("1"); });
QObject::connect(buttons[9], &QPushButton::clicked, [=]() { lineEdit->insert("2"); });
QObject::connect(buttons[10], &QPushButton::clicked, [=]() { lineEdit->insert("3"); });
QObject::connect(buttons[11], &QPushButton::clicked, [=]() { lineEdit->insert("-"); });
QObject::connect(buttons[12], &QPushButton::clicked, [=]() { lineEdit->insert("0"); });
QObject::connect(buttons[13], &QPushButton::clicked, [=]() { lineEdit->insert("."); });
QObject::connect(buttons[14], &QPushButton::clicked, [=]() { lineEdit->setText(QString::number(eval(lineEdit->text()))); });
QObject::connect(buttons[15], &QPushButton::clicked, [=]() { lineEdit->insert("+"); });

gridLayout->addWidget(lineEdit, 0, 0, 1, 4);


window->setLayout(gridLayout);
window->show();

return app.exec();


}
```
Bu dastur, oddiy bir hisob mashinasi dasturi yaratadi. QApplicationyordamida bir Qt dasturi ishga tushiriladi va QWidgetbir pencere yaratiladi. QLineEdityordamida bir matn kirish maydoni yaratiladi va QGridLayouttugmalar va kirish maydoni tashkil etiladi.
Düğmeler va tadbirlari ( QPushButton::clickedsigni bilan bog'liq lambda ifadeleri) yaratiladi va keyin QGridLayoutichida o'tkaziladi. Her düğmeye bir etiket atanir ve düğmelerin tıklanma olaylari belirlenir. Düğmelerin tıklanma olaylari, tıklanıldığında kirish maydonina tegishli ekler yoki hesaplama jarayonlari amalga oshiriladi.
Son sifatida, tugmalar va kirish maydoni QGridLayoutichiga joylashtiriladi va pencere ko'rsatiladi.
Bu kod, faqat asosiy hisoblama jarayonlarini amalga oshiradi va yanada rivojlangan bir hisob mashinasi uchun ek funksiyalar eklenmesi kerak.

2. Quyida, 5 xil vidjet (QSlider, QScrollBar, QRadioButton, QCheckBox va QPushButton) bir Qt GUI dizaynidan iborat. Uning bir vidjeti, signal-slot mexanizmining birbirlari bilan aloqaga kirishi mumkin. Masalan, QScrollBarning harakati QSlider'i ta'sir qiladi va QRadioButton yoki QCheckBox'ning holati QPushButton'i ta'sir qiladi.

```cpp
#include
#include
#include
#include
#include
#include
#include
#include
#include

int main(int argc, char *argv[]) {


QApplication app(argc, argv);

QWidget *window = new QWidget();


window->setWindowTitle("GUI Loiyhasi");

QSlider *slider = new QSlider(Qt::Horizontal);


QScrollBar *scrollBar = new QScrollBar(Qt::Horizontal);
QRadioButton *radioButton = new QRadioButton("Radio Button");
QCheckBox *checkBox = new QCheckBox("Check Box");
QPushButton *pushButton = new QPushButton("Push Button");

QVBoxLayout *layout = new QVBoxLayout();


layout->addWidget(slider);
layout->addWidget(scrollBar);
layout->addWidget(radioButton);
layout->addWidget(checkBox);
layout->addWidget(pushButton);

QObject::connect(slider, &QSlider::valueChanged, [=](int value) {


qDebug() << "Slider degeri:" << value;
});

QObject::connect(scrollBar, &QScrollBar::valueChanged, [=](int value) {


qDebug() << "ScrollBar degeri:" << value;
});

QObject::connect(radioButton, &QRadioButton::toggled, [=](bool checked) {


qDebug() << "Radio Button durumu:" << checked;
});

QObject::connect(checkBox, &QCheckBox::stateChanged, [=](int state) {


qDebug() << "Check Box durumu:" << (state == Qt::Checked);
});

QObject::connect(pushButton, &QPushButton::clicked, [=]() {


qDebug() << "Push Button tiklandi.";
});

window->setLayout(layout);


window->show();

return app.exec();


}
```
Bu kod, QSlider, QScrollBar, QRadioButton, QCheckBox va QPushButton vidjetlarini yordamida Qt GUI dizayni yaratadi. Sinyal-slot ulanishlari har bir vidjetga ulanishda mavjud bo'lganda bir geri bildirish imkonini beradi.
Slider yoki ScrollBar harakat qilinayotganda, qiymati konsola yoziladi. RadioButton yoki CheckBox holati o'zgartirilsa, konsola yoziladi. PushButton tiqilib, bir xabar konsola yoziladi.
Bu tarzda, uning bir vidjeti birbirining holati o'zgarishlariga javob berishi mumkin va geri bildirish mumkin.
3. Aşağıda, 3x3 bir Kerstik-nolik o'yin maydoni, QLabel va "Tozalash" tugmasi bilan QGridLayout bir Qt o'yini dizayni berilgan. QSignalMapper sinfidan foydalaniladigan tugmalarning signal-slot ulanishlari amalga oshirildi. Her tıklamada o'yinchi qatori va bo'sh tugma kontrol edilerek holati güncellenir.

```cpp
#include


#include
#include
#include
#include
#include

int main(int argc, char *argv[]) {


QApplication app(argc, argv);

QWidget *window = new QWidget();


window->setWindowTitle("Kerstik-nolik O'yini");

QGridLayout *gridLayout = new QGridLayout();


QLabel *playerLabel = new QLabel("Player1");
QPushButton *buttons[3][3];
QSignalMapper *signalMapper = new QSignalMapper();

for (int row = 0; row < 3; ++row) {


for (int col = 0; col < 3; ++col) {
buttons[row][col] = new QPushButton();
buttons[row][col]->setFixedSize(100, 100);
gridLayout->addWidget(buttons[row][col], row, col);

QObject::connect(buttons[row][col], &QPushButton::clicked, signalMapper, static_cast(&QSignalMapper::map));


signalMapper->setMapping(buttons[row][col], buttons[row][col]);
}
}

QPushButton *resetButton = new QPushButton("Tozalash");


gridLayout->addWidget(resetButton, 3, 0, 1, 3);

QObject::connect(signalMapper, static_cast(&QSignalMapper::mapped), [=](QWidget *button) {


QPushButton *clickedButton = qobject_cast(button);
if (clickedButton) {
QString buttonText = clickedButton->text();
if (buttonText.isEmpty()) {
QString currentPlayer = playerLabel->text();
clickedButton->setText(currentPlayer == "Player1" ? "X" : "O");
playerLabel->setText(currentPlayer == "Player1" ? "Player2" : "Player1");
}
}
});

QObject::connect(resetButton, &QPushButton::clicked, [=]() {


for (int row = 0; row < 3; ++row) {
for (int col = 0; col < 3; ++col) {
buttons[row][col]->setText("");
}
}
playerLabel->setText("Player1");
});

gridLayout->addWidget(playerLabel, 4, 0, 1, 3);

window->setLayout(gridLayout);
window->show();

return app.exec();


}
```Bu kod, QWidget'dan turetilen bir pencere yaratadi va QGridLayout yordamida 3x3 o'yin maydonini tuzadi. Har bir hujayra uchun bir QPushButton yaratiladi va QSignalMapper uchun uning bir tugmasi uchun bir signal-slot ulanishi qilinadi.
Tıklanan tugmaning metni nazorat qilinadi va bo'shsa, "Player1" yoki "Player2" etiketlerini günceller. "Tozalash" tugmasi bosilganda, barcha tugmalar metni temizlenir ve "Player1" etiketi qayta ayarlanır.
Bu tarzda, Kerstik-nolik o'yinining oddiy bir ilovasi yaratiladi va o'yin maydoni va etiketler o'rtasida muloqot sağlanadi.

Download 22.06 Kb.

Do'stlaringiz bilan baham:
1   2




Ma'lumotlar bazasi mualliflik huquqi bilan himoyalangan ©fayllar.org 2024
ma'muriyatiga murojaat qiling