投稿

ラベル(Qt)が付いた投稿を表示しています

Qt TableView

イメージ
# QtのTableViewの最もシンプルな例を紹介します。 QtTableViewはデータをテーブル上に表示するGUIウィジェットです。 主に次の様な手順で使用します。 * TableViewをインスタンスし、用意する * モデルデータオブジェクトを定義する * TableViewの`setModel`メソッドでオブジェクトを渡す ### TableViewのモデルを作成する 今回は配列や構造体を用意せず、単純に振る舞いを見える様にしたサンプルを作りました。 TableViewにデータを表示するにはモデルが必要になります。 モデルを作成するには`QAbstractTableModel`を継承したクラスを定義し`TableView::setModel()`に渡す必要があります。 ``` #include #include class mydata : public QAbstractTableModel { Q_OBJECT public: explicit mydata(QObject *parent = nullptr); virtual ~mydata() override; }; ``` TableViewの`TableView::setModel()`にセットされたオブジェクトはTableViewから次のメソッドが呼び出される為オーバーライドして定義する必要があります。 ### 必要なメソッド * `columnCount()` 列数を返すメソッド * `rowCount()` 行数を返すメソッド * `data()` 要求データを返すメソッド * `headerData()` ヘッダーを返すメソッド ※今回のサンプルは配列や構造体を使わず振る舞いを知る為の例ですので、実用するには`addData()`等オブジェクト内でデータを管理するプログラムが必要になります。 ## メソッドを定義する ### mydata.h ``` #include #include class mydata : public QAbstractTableModel { Q_OBJECT public: explicit mydata(QObject *parent = nullptr); ...

Qt5 シグナルとスロット (2019年)

Qtではイベント処理をする際にシグナルとスロットをコネクト関数で接続します。 #### Window::Window()メソッド内 ``` Widget Obj1; connect(Obj1, SIGNAL(click()), this, SLOT(func())); ``` ## シグナルとは Qtのシグナルとはウィジェットが反応するイベントの種類の事で、対応しているシグナルは公式クラスドキュメントから見る事が出来ます。 ## スロットとは スロットとは、シグナルが発生した時に反応させる関数の事で、この一連の流れを「シグナルをスロットに接続する」とよく言われます。 先程上で出した例は現在では古い記法でQt5からは次の記法で記述可能です。 #### Window::Window()メソッド内 ``` Widget Obj1; connect(Obj1, &Widget::click, this, &Window::func); ``` シグナルを`&Widget::click`の様にしてセットする事で`SIGNAL(click())`の代替えが可能です。 スロットも`&Window::func`とする事ができます。

Qtのススメ!

これまで何個も当ブログではQt関連の記事を書いていますが、何故Qtに拘るのかを今回は記事にして行きたいと思います。 そもそもQtとは各プラットフォーム対応のFrameworkで、主にGUIを手軽に利用出来るのが強みです。また、GUIに限らずデータ処理、グラフィック処理、ネットワーク関係のプログラムをこのFrameworkは対応しており、各プラットフォームの対応した出力をする事が出来ます。 ### 対応プラットフォーム |タイプ| OS | |:-|:-| |デスクトップ|Windows, Mac OS, Ubuntu| |タブレット|Windows, Android, iOS(iPad)| |モバイル|Android, iOS(iPhone)| よく聞く・目にする端末は大体Qtが使えると言うのが強みです。 ## Qtの強み1 Qt自体は様々な言語に対応していますが、やはりメインと言えばC++です。 C/C++は移植性の低い言語で有名で、OSや端末ごとに違うソースを使うの主流でした。ただし、Qtは1種類のソースをプログラマーが記述する事でQtが移植性の問題を解決してくれます。 本来GUIプログラミングしWindowsでは`.NET Framework`を使い、Mac OSでは`Cocoa Framework`を使います。またWindowsの場合Framework自体はC++対応ですが、Mac OSのCocoaはObjective-CまたはSwift等の言語を使う必要があります。 Qtではプラットフォーム毎に最適なネイティブフレームワークを呼び出しGUIアプリケーションを作る事が出来ます。 ## Qtの強み2 個人的に結構簡単にGUIを直ぐに利用出来るのは一番の強みだと思います。 ``` QWidget *window = new QWidget; window->show(); ``` たったこれだけの記述でウィンドウを作成する事が可能になります。 ## Qtの強み3 最初は混乱するかもしれませんが、ウィジェットの構造をザックリ理解出来れば基本的なGUIプログラミングが可能になります。 - Qt Application * QObject * QWidget * QPushButton ...

Qt QDateTimeEdit について

QDateTimeEditウィジェットを使うにはQDateTimeオブジェクトも兼用して使う事になります。 ``` QDateTimeEdit *dateTime = new QDateTimeEdit; this.addWidget(dateTime); ``` この状態では初期値が2000年代になりますので、QDateTimeオブジェクトを使って現在の日時を初期値として渡してあげます。 ``` QDateTime *date = QDateTime; QDateTimeEdit *dateTime = new QDateTimeEdit; dateTime->setDateTime(date->currentDateTime()); //現在の日時をセット this.addWidget(dateTime); ``` 現在日時は`QDateTime::currentDateTime()`メソッドで取得し、`QDateTimeEdit::setDateTime()`に渡して初期化しています。 currentDateTime()メソッドはコンピューターの現在日時を取得します。 ## 前日・後日を指定 初期値を前日・後日にしたい場合は、次の様にします。 ``` QDateTime::currentDateTime().addDays(-2); ``` 上記`addDays()`メソッドは起点となる日から加算・減算した日付を返します。 例では現在日時から2日前を指しています。 ※負の場合は前日を返します。

Qt QMenuBar・QMenu使い方

## Source ``` QMenuBar *AppMenu = new QMenuBar(this); QMenu *Item_1 = AppMenu->addMenu("Item1"); QMenu *Item_2 = AppMenu->addMenu("Item2"); Item_1->addAction("1-1", this, [=]{ qDebug() addAction("1-2", this, [=]{ qDebug() addAction("2-1", this, [=]{ qDebug() addMenu("Item1"); QMenu *Item_2 = AppMenu->addMenu("Item2"); ``` 項目は`QMenu`に`QMenuBar`の親アイテムを渡します。 親アイテムに`addAction`メソッドでアクションを追加して行く事で子項目を増やして行く事が出来ます。 ## Mac OSのメニューの場合の特例 Mac OSで「環境設定」や「about」の項目を生成するには項目名に特定の文字列を渡す事で追加する事が出来ます。 ドキュメントでは以下の様に説明がなされています。 [https://doc.qt.io/qt-5/qmenubar.html#qmenubar-as-a-global-menu-bar](https://doc.qt.io/qt-5/qmenubar.html#qmenubar-as-a-global-menu-bar) |String matches|Placement|Notes| |:--|:--|:--| |about.* |Application Menu ・ About | The application name is fetched from the Info.plist file (see note below). If this entry is not found no About item will appea...

XCodeでQtを使う方法

Qtでの開発はQtCreatorで十分ですが、XCodeの方が機能・デザイン共に上です...そこでQtをXCodeで使う方法を紹介します。 ## 必要条件 - QtCreatorがインストールされている - XCodeがインストールされている ## Qtプロジェクトの作成 今回やる方法は、QtプロジェクトをXCodeプロジェクトに変換する作業です。 まずはじめに、QtCreatorなりで新規プロジェクトを作成します。 ``` #include #include #include #include int main(int argc, char *argv[]) { QApplication a(argc, argv); QWidget *window = new QWidget; QPushButton *button = new QPushButton("click"); QHBoxLayout *layout = new QHBoxLayout; layout->addWidget(button); window->setLayout(layout); window->show(); return a.exec(); } ``` こんな感じでサクッとmain.cppを作成します。本来qmakeファイル(.pro)があれば十分です。 ## qmakeでxcodeプロジェクト作成 qmakeはインストール方法や環境によって異なります。 特に設定をしていないと`/Users/UserName/Qt/5.10.1/clang_64/bin/`内にあると思います。 Qtバージョン等も含めて環境に合わせてください。 ``` qmake -spec macx-xcode projectName.pro ``` Xcodeプロジェクトにしたいプロジェクトディレクトリに移動して、上記コマンドを実行します。 `projectName.pro`はプロジェクト名+`.pro`となります。 上記コマンドを実行するとプロジェクトディレクトリに`projectName..xcodeproj`が生成されるので、これを開く事でXCo...

Qt HTTPリクエスト

# QNetworkAccessManager Qt(C++)でHTTPリクエストをするには`QNetworkAccessManager`を使い実装します。 ネットワーク関係のプロジェクトを作る際はqmakeのファイルに「network」を追加します。 ### .pro ``` QT += core gui network ``` ### main.cpp ``` #include #include #include #include #include #include #include int main(int argc, char *argv[]) { QApplication a(argc, argv); // QWidgets QWidget *window = new QWidget; QVBoxLayout *Layout1 = new QVBoxLayout; QPushButton *button = new QPushButton("Request"); // Qt Network QNetworkAccessManager *netManager = new QNetworkAccessManager; QString RequestUrl = "http://localhost:8888/"; // PushButton Event QObject::connect(button, &QPushButton::clicked, [=]{ netManager->get(QNetworkRequest(QUrl(RequestUrl))); }); // QNetworkAccessManager Event QObject::connect(netManager, &QNetworkAccessManager::finished, [=](QNetworkReply *reply){ qDebug() readAll(); }); Layout1->addWidget(...

Qt 基礎知識 (Hello World)

イメージ
## Qtとは Qt(C++)はWindows・Mac OS・Ubuntuのプラットフォームに対応したフォームアプリケーション開発の移植性を解決し、同じソースで複数のプラットフォームに対応したアプリケーションを作る事が出来ます。また、OSによるUIもネイティブな物を使用している為OSに馴染むUIを使える利点があります。 当ブログでは「QtCreator」を使用し、UIデザイナ等の機能は一切使用しません。また当記事は今後配信するQt情報のベースとなる基礎的な内容を記載して行きます。 ## Hello Worldを表示 ### 基本的な記述 Qtのアプリケーション開発を始めるには必ず`QApplication`ヘッダーをインクルードする必要があります。 主に次の様な流れで記述して行きます。`QApplication`インクルード→main引数の`argc, argv`を`QApplication`に渡す→main関数の戻り値に`a.exec();`を渡す。 ``` #include int main(int argc, char *argv[]) { QApplication a(argc, argv); return a.exec(); } ``` `QApplication a(argc, argv);`〜`return a.exec();`の間に主なプログラムを記述して行くのがQtのスタイルです。 ### コンソールにHello Worldを表示 コンソールに文字列やデータを表示するには`QDebug`が必要になります。 QDebugの`qDebug()`を使う事でQtCreatorの「アプリケーション出力」から渡した値を見る事が出来ます。 ``` #include #include int main(int argc, char *argv[]) { QApplication a(argc, argv); qDebug() > Hello World ``` ### 画面上にHello Worldを表示 画面上に文字列等を表示するには`QLabel`が必要になります。QLabelはQObjectとQWidgetを継承したクラスで、画面上に文字列等を表示する事が出来ます。 QLa...

Qt setWindowFlagsについて

イメージ
Qtでウィンドウを生成する際、一言にウィンドウと言ってもダイアログウィンドウやポップアップウィンドウ等様々なタイプがあります。 またその他ウィンドウとしての機能で様々なオプションがありますが、これらの設定をQWidgetの`setWindowFlags()`メソッドを利用して設定します。 ## setWindowFlags(Qt::WindowFlags Type) ウィンドウフラグではTypeとHintの2種類の値をセットする事が出来、Typeでは大まかなウィンドウのタイプ(PopupやDialog等)を設定し、Hintでは細かいオプションを設定する事が出来ます。 またTypeは1つの値しか設定出来ませんが、Hintは複数設定する事が出来ます。 ``` //Window QWidget *window = new QWidget; window->setWindowTitle("サンプルウィンドウ"); window->setWindowFlags(Qt::Window| Qt::CustomizeWindowHint| Qt::WindowCloseButtonHint); window->show(); ``` ## タイプの種類について |Type|説明| |:-----|:-----| |Qt::Window|一般的なタイトルとコントロールのあるウィンドウを作成します| |Qt::Dialog|ダイアログウィンドウが生成され、最大化・最小化のコントロールがありません| |Qt::Sheet|Mac OSのSheetを生成します。コントロールやタイトルはありません| |Qt::Drawer|Mac OSのサブウィンドウを生成します。ウィンドウレイヤーは親ウィンドウの前後になります| |Qt::Popup|ポップアップウィンドウを生成します。他のコントロールをクリックすると閉じます| |Qt::Tool|ツールウィンドウを生成します。タイトルや装飾は必要最低限の物しかありません| |Qt::ToolTip|ツールチップである事を示します。ツ...

Qt ウィンドウのあれこれ

イメージ
Qtでウィンドウを作成するには主に2通りの方法があり、QMainWindowかQWidgetを使うかで別れます。 また、QWidgetを継承しているQtウィジェット類は`show()`メソッドによって個別のウィンドウとして表示されます。 ---- > ウィンドウの作成 > ウィンドウにタイトルを付ける > ウィンドウのサイズを設定する > > 絶対値で設定 > > リサイズ > > サイズの最大値を設定 > > サイズの最小値を設定 > > 最大値と最小値を兼用しよう > ウィンドウの見た目を変える ---- ## ウィンドウの作成 QWidgetでウィンドウ自体は簡単に作成出来ます。 `//Window`から2行でウィンドウの作成をしています。 ``` #include #include int main(int argc, char *argv[]) { QApplication a(argc, argv); //Window QWidget *window = new QWidget; window->show(); return a.exec(); } ``` QWidgetまたはQWidgetを継承しているオブジェクトは`show()`メソッドを実行する事でウィンドウの作成が出来ます。 この例では内容の無いウィンドウを表示しているので全ての設定はデフォルトになっています。 ## ウィンドウにタイトルを付ける 作成したウィンドウには`setWindowTitle(const QString &)`メソッドによってタイトルを付ける事が出来ます。 ``` #include #include int main(int argc, char *argv[]) { QApplication a(argc, argv); //Window QWidget *window = new QWidget; window->setWindowTitle("サンプルウィンドウ"); ...

Qt レイアウト 余白の処理

# Qt レイアウトによる余白の処理 QtのLayoutはStyleSheet適応外ですが、デフォルトでは前後左右、約11pxの余白が入ります。 QMLDesignerだとプロパティ設定から余白を変える事が出来ますが、 フルスクラッチだとちょっと気づき難いかもしれません ``` QWidget *widget = new QWidget; QHBoxLayout *layout = new QHBoxLayout; widget->setLayout(layout); widget->show(); ``` この状態だと余白により思い通りなデザインにする事が出来ません。 ![デフォルトの状態](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjHiJo3NdLYVInVnp5wTA2ThrX7IYFwjzqjEleYvhBJvZ2RzSEim9EBk9eHc5aT7S-wx0xQ1uS-QpVVwqjvUqr2jSMUqzUJJL-gfEAoOOlEF1s6dyXQjxk5rfYjtvEHB-ljqALzQMZ-ZK8/s320/%25E3%2582%25B9%25E3%2582%25AF%25E3%2583%25AA%25E3%2583%25BC%25E3%2583%25B3%25E3%2582%25B7%25E3%2583%25A7%25E3%2583%2583%25E3%2583%2588+2019-02-26+2.01.36.png) ## 余白を消す これはLayoutのMarginが邪魔をしているので、マージンをリセットしてあげる必要があります。 ``` QWidget *widget = new QWidget; QHBoxLayout *layout = new QHBoxLayout; //margin reset layout->setContentsMargins(0, 0, 0, 0); widget->setLayout(layout); widget->show(); ``` `setContentsMargins(Left, Top, right, bottom)`はmarginを指定するメソッドです。 この他...