Вернуться наверх
aco.ifmo.ru photonic
вернуться в оглавление предыдущая глава предыдущий параграф следующий параграф следующая глава


Короткие примеры (справочник)

  1. Структура приложения
  2. Работа с вещественными числами
  3. Работа с QString (перевод в число, в std::string)
  4. Обработка событий «сигнал» - «слот»
  5. Выпадающие списки (QComboBox)
  6. Переключатели (QRadioButton)
  7. Работа с таблицей (QTableWidget)
  8. Создание пункта контекстного меню

1. Структура приложения

main.cpp

#include <QApplication>
// описание диалогового окна
#include "dqtlens.h"

int main(int argc, char* argv[]) 
{
    // создаем приложение
    QApplication app(argc, argv);
    // создаем диалоговое окно
    DQtOLens dialog;
    // запускаем дилоговое окно
    dialog.show();
    // запускаем приложение
    return app.exec();
}

dqtlens.h

#ifndef DQTLENS_H
#define DQTLENS_H

// подключение файла с описанием ресурсов. 
// Этот файл генерируется автоматически во время компиляции по ui-файлу. 
// Имя подключаемого файла должно быть “ui_[имя ui-файла].h”
#include "ui_dqtlens.h"

// подключение файла с описанием QDialog
#include <QDialog>

class DQtLens: public QDialog
{
//
    Q_OBJECT
public:
    // конструктор и деструктор
    DQtLens (QWidget *parent = 0);
    ~DQtLens ();

private:
   // описание ресурсов диалогового окна (ui-файл)
    Ui::dqtlens m_ui;
};
#endif // DQTLENS_H

dqtlens.cpp

#include "dqtlens.h"

DQtLens:: DQtLens (QWidget *parent)
: QDialog (parent)
{
    m_ui.setupUi(this);
}
DQtLens::~ DQtLens ()
{
}

2. Работа с вещественными числами

Установка типа данных (double) и начальных значений (в конструкторе)

#include <QDoubleValidator>
…
m_ui.m_LE_Value->setValidator(new QDoubleValidator(m_ui.m_LE_Value));
m_ui.m_LE_Value->setText("1.0"); 

Берем значения из диалога, вычисляем и записываем в диалог

double dValue = m_ui.m_LE_Value->text().toDouble()*2;
m_ui.m_LE_Value->setText(QString("%1").arg(dValue));

3. Работа с QString (перевод в число, в std::string)

перевод из строки в число

QString qText="55.55";
double dValue= sText.toDouble();

перевод из числа в строку

double dValue=55.55;
QString qText=QString("%1").arg(dValue);

перевод из QString в std::string

QString qText="test";
std::string sText= qText.toStdString();

перевод из std::string в QString

std::string sText="test";
QString qText = QString(sText.c_str());

4. Обработка событий  «сигнал» - «слот»

В h-файле – описание функции (слота) обработки нажатия кнопки

// ключевое слово, обозначающее, что дальше идет описание слотов
public slots:
    // описание слота (название функции придумываем сами)
    void OnPBCalc();

В конструкторе - связь между сигналом(событием) от объекта и функцией-обработкой события

// connect([кто посылает], SIGNAL([сигнал]), [кто обрабатывает], SLOT([слот]));
connect(m_ui.m_PB_Calc, SIGNAL(clicked()), this, SLOT(OnPBCalc()));

или

// connect([кто посылает], &[имя_класса]::[сигнал], [кто обрабатывает], &[имя_класса]::[слот]);
connect(ui->m_PB_Calc, &QButton::clicked, this, &MyDialog::OnPBCalc);
  • m_ui.m_PB_Calc – имя кнопки, посылающей сигнал
  • clicked() – сигнал, у каждого элемента управления могут быть свои сигналы
  • this – класс (диалог), в котором мы работаем , обрабатывает сигнал
  • OnPBCalc() – функция класса this обрабатывает сигнал. Параметры функции должны совпадать с параметрами слота

Функция (слот):

#include <QMessageBox>void DQtLens::OnPBCalc()
{
    // обработка события, например вывод сообщения
    QMessageBox::warning(this, "Заголовок окна", "Текст, выводимый на окне");
}

5. Выпадающие списки (QComboBox)

Выполнение каких-то действий при изменении выбранного пункта в списке

Сигнал-слот в конструкторе (на забыть описать слот в h-файле)

// сигнал вызывается при изменении выбранного пункта списка
connect(m_ui.m_CB_Type, SIGNAL(currentIndexChanged(int)), this, SLOT(OnChangeType(int)));

Обработка сигнала - по индексу

Если нумерация элементов в списке известна, и неизменно, лучше пользоваться доступом по индексу

void DQtLens::OnChangeType(int)
{
    // нумерация элементов списка начинается с 0
    if(m_ui.m_CB_Type->currentIndex()==0)      // 1й пункт списка
    {
        QMessageBox::warning(this, "Оптическая система", "телескоп");
    }
    else if(m_ui.m_CB_Typе->currentIndex()==1) // 2й пункт списка
    {
        QMessageBox::warning(this, "Оптическая система", "микроскоп");
    }
    // и т.д., по количеству пунктов в списке
}

Обработка сигнала - по тексту

Если последовательность элементов в списке может быть произвольной, или нужно делать более сложные действия с элементами списка (например искать частичное совпадение с заданным текстом, регулярным выражением и т.д.) можно воспользоваться доступом по тексту. В этом случае будьте очень внимательны с кодировкой русского текста - кодировка списка должна совпадать с шаблоном для поиска.

void DQtLens::OnChangeType(int)
{
    if(m_ui.m_CB_OSType->currentText()=="00 - телескоп")
    {    
        QMessageBox::warning(this, "Оптическая система", "телескоп");
    }
    else if(m_ui.m_CB_OSType->currentText()=="10 - микроскоп") 
    {
        QMessageBox::warning(this, "Оптическая система", "микроскоп");
    }
    // и т.д.
}

6. Переключатели (QRadioButton)

Выполнение каких-то действий при выборе переключателя.

Сигнал-слот в конструкторе (на забыть описать слот в h-файле)

// создаем связь между сигналом(событием) от объекта и функцией-обработкой события. 
// Оба переключателя будут вызывать одну и ту же функцию
connect(m_ui.m_RB_Obj_far, SIGNAL(clicked()), this, SLOT(OnObjTypeChanged()));
connect(m_ui.m_RB_Obj_near, SIGNAL(clicked()), this, SLOT(OnObjTypeChanged()));

Обработка сигнала

void DQtLens::OnObjTypeChanged()
{
    if(m_ui.m_RB_Obj_far->isChecked())
    {
        QMessageBox::warning(this, "Тип предмета", "дальний");
    }
    if(m_ui.m_RB_Obj_near->isChecked())
    {
        QMessageBox::warning(this, "Тип предмета", "ближний");
    }
}


7. Работа с таблицей (QTableWidget)

    // устанавливаем количество колонок у таблицы
    m_ui.m_Table->setColumnCount(10);
    for(int iRow=0; iRow<10; ++iRow)
    {
        // вставляем новую строку
        m_ui.m_Table->insertRow(iRow);
        // зполняем каждую ячейку
        for(int iCol=0; iCol<10; ++iCol)
        {
            // вычисляем значение, которое хотим поместить в ячейку таблицы
            double dValue=(iCol+1)*(iRow+1);
            // создаем новую ячейку (Item) таблицы
            QTableWidgetItem* qItem = new QTableWidgetItem();
            // устнавливаем параметры: ячейка доступна + ее можно выбрать + ее можно редактировать
            qItem->setFlags(Qt::ItemIsEnabled | Qt::ItemIsSelectable | Qt::ItemIsEditable);
            // устанавливаем значение в ячейку как double
            qItem->setData(0, QVariant::fromValue(dValue));
            // устанавливаем созданную ячейку в нужное место в таблицы
            m_ui.m_Table->setItem(iRow, iCol, qItem);
        }
    }

8. Создание пункта контекстного меню

В h-файле

// описание указателя на пункт меню
    QAction *m_pqAddSurface;
    …
// описание функции (слота) обработки вызова пункта меню
public slots:
    void OnAddSurface ();

В конструкторе

    // создаем пункт меню для создания новой поверхности в таблице
    m_pqAddSurface = new QAction("Добавить новую поверхность перед выделенной", this );
    …
    connect(m_pqAddSurface,    &QAction::triggered, this, &DQtLens::OnAddSurface);

Функция обработки нажатия на пункт меню

// обработка события нажатия на пункт меню
void
DQtLens::OnAddSurface()
{
    // что-то делаем
}