コンテンツにスキップ

Qtプログラミング

出典: フリー教科書『ウィキブックス(Wikibooks)』

Qtとは

[編集]

Qtは、クロスプラットフォームのGUIアプリケーション開発フレームワークです。C++をベースとしており、Python(PyQt)やその他の言語でも利用可能です。デスクトップアプリケーション開発において、特に産業用ソフトウェアやプロフェッショナルツールの開発で広く採用されています。

開発環境のセットアップ

[編集]

Qt Creatorは、Qt開発の標準的なIDEです。以下の手順でセットアップします:

  1. Qt公式サイトからQt Installerをダウンロード
  2. インストール時に必要なコンポーネントを選択(Qt Creator、コンパイラ、デバッガなど)

基本的なアプリケーション作成

[編集]

Hello Worldアプリケーション

[編集]
#include <QApplication>
#include <QLabel>

int main(int argc, char *argv[]) {
    QApplication app(argc, argv);
    
    QLabel label("Hello, Qt!");
    label.show();
    
    return app.exec();
}

メインウィンドウの作成

[編集]
#include <QMainWindow>
#include <QApplication>
#include <QPushButton>

class MainWindow : public QMainWindow {
    Q_OBJECT
    
public:
    MainWindow(QWidget *parent = nullptr) : QMainWindow(parent) {
        setWindowTitle("My Qt Application");
        setMinimumSize(400, 300);
        
        QPushButton *button = new QPushButton("Click Me", this);
        button->setGeometry(150, 120, 100, 30);
        
        connect(button, &QPushButton::clicked, this, &MainWindow::handleButton);
    }
    
private slots:
    void handleButton() {
        qDebug() << "Button clicked!";
    }
};

int main(int argc, char *argv[]) {
    QApplication app(argc, argv);
    MainWindow window;
    window.show();
    return app.exec();
}

シグナルとスロット

[編集]

Qtのシグナルとスロットはイベント処理の核となる機能です。

class Calculator : public QObject {
    Q_OBJECT
    
public:
    Calculator() {}
    
public slots:
    void calculate(int value) {
        result = value * 2;
        emit resultReady(result);
    }
    
signals:
    void resultReady(int result);
    
private:
    int result;
};

// 使用例
Calculator *calc = new Calculator();
connect(calc, &Calculator::resultReady, 
        this, &MyClass::handleResult);

レイアウト管理

[編集]

Qtではレイアウトマネージャーを使用して、ウィジェットの配置を管理します。

QWidget *window = new QWidget;
QPushButton *button1 = new QPushButton("One");
QPushButton *button2 = new QPushButton("Two");
QPushButton *button3 = new QPushButton("Three");

QVBoxLayout *layout = new QVBoxLayout;
layout->addWidget(button1);
layout->addWidget(button2);
layout->addWidget(button3);

window->setLayout(layout);

カスタムウィジェットの作成

[編集]
class CustomWidget : public QWidget {
    Q_OBJECT
    
public:
    CustomWidget(QWidget *parent = nullptr) : QWidget(parent) {
        // ウィジェットの初期化
    }
    
protected:
    void paintEvent(QPaintEvent *event) override {
        QPainter painter(this);
        painter.setPen(Qt::blue);
        painter.drawEllipse(10, 10, 100, 100);
    }
    
    void mousePressEvent(QMouseEvent *event) override {
        if (event->button() == Qt::LeftButton) {
            emit clicked();
        }
    }
    
signals:
    void clicked();
};

データベース連携

[編集]

QtはSQLデータベースとの連携も容易です。

QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
db.setDatabaseName("mydatabase.db");

if (!db.open()) {
    qDebug() << "Database error:" << db.lastError().text();
    return;
}

QSqlQuery query;
query.exec("CREATE TABLE users (id INTEGER PRIMARY KEY, name TEXT)");
query.exec("INSERT INTO users (name) VALUES ('John Doe')");

query.exec("SELECT * FROM users");
while (query.next()) {
    QString name = query.value(1).toString();
    qDebug() << "Name:" << name;
}

ネットワークプログラミング

[編集]
class HttpClient : public QObject {
    Q_OBJECT
public:
    HttpClient() {
        connect(&manager, &QNetworkAccessManager::finished,
                this, &HttpClient::handleResponse);
    }
    
    void sendRequest(const QString &url) {
        QNetworkRequest request(url);
        manager.get(request);
    }
    
private slots:
    void handleResponse(QNetworkReply *reply) {
        if (reply->error()) {
            qDebug() << "Error:" << reply->errorString();
            return;
        }
        
        QString answer = reply->readAll();
        qDebug() << "Response:" << answer;
    }
    
private:
    QNetworkAccessManager manager;
};

リソース管理

[編集]

Qtのリソースシステムはアプリケーションのアセットを管理します。

resources.qrc
<!-- resources.qrc -->
<!DOCTYPE RCC>
<RCC version="1.0">
    <qresource prefix="/images">
        <file>icon.png</file>
    </qresource>
</RCC>
// リソースの使用
QIcon icon(":/images/icon.png");
button->setIcon(icon);

デプロイメント

[編集]

アプリケーションのデプロイには、必要なライブラリと依存関係を含める必要があります:

  1. Windows: windeployqt ツールの使用
  2. Linux: linuxdeployqt または必要なライブラリの手動包含
  3. macOS: macdeployqt の使用

パフォーマンス最適化

[編集]
  • シグナル/スロット接続にQt::DirectConnectionを使用
  • ウィジェットのアップデートを最小限に抑える
  • 大量のデータ処理にはQThreadを使用
class Worker : public QObject {
    Q_OBJECT
public slots:
    void process() {
        // 重い処理
        emit finished();
    }
signals:
    void finished();
};

// 使用例
QThread *thread = new QThread;
Worker *worker = new Worker;
worker->moveToThread(thread);

connect(thread, &QThread::started, worker, &Worker::process);
connect(worker, &Worker::finished, thread, &QThread::quit);

thread->start();

ユニットテスト

[編集]
class TestQString: public QObject {
    Q_OBJECT
private slots:
    void toUpper() {
        QString str = "Hello";
        QCOMPARE(str.toUpper(), QString("HELLO"));
    }
};

QTEST_MAIN(TestQString)
#include "testqstring.moc"

以上が、Qtプログラミングの基本的な概要です。Qtは非常に広範なフレームワークであり、この記事で紹介した機能は、その一部に過ぎません。より詳細な情報は、Qt公式ドキュメントを参照することをお勧めします。