目次
1.QTのダウンロードとインストール
QT をダウンロードする前に、まず QT とは何か、QT で何ができるのかを知る必要があります。
Qt はクロスプラットフォームの C++ 開発ライブラリであり、主にグラフィカル ユーザー インターフェイス Qt の開発に使用されます。Qt はグラフィカル インターフェイス アプリケーションを開発するための GUI ライブラリとみなされることが多いですが、これが Qt のすべてではなく、美しいインターフェイス (コントロール、レイアウト、インタラクションなど) を描画するだけでなく、マルチスレッドなどの多くの機能も備えています。 , データベースへのアクセス、画像処理、音声・動画処理、ネットワーク通信、ファイル操作など。
次に QT のダウンロードを開始しましょう
-
公式サイトダウンロードアドレス: https:
//download.qt.io/archive/qt/5.14/ -
exe ファイルをダウンロードするだけです。
インストール パッケージは少し大きいので、しばらくお待ちください。
-
QTをインストールする
1. exe ファイルをクリックし、「次へ」を選択します。
2. Qt アカウントにログインします。アカウントをお持ちでない場合は、まずこのページから登録してください。なお、アカウントのパスワードは 7 文字以上で、英小文字、大文字、数字、記号 (*) の 4 種類のうち 3 種類を含む必要があります。 *!"#/() =?@${[]}\,.-_|;:'*^~+**)
新規ユーザー登録後、メールに記載されているアクティベーションリンクをクリックしてアクティベートし、アクティベーション後、インストールページに戻ってログインしてください。
3. 下の図の赤いボックスにチェックを入れて、「次へ」をクリックします
4.「次へ」をクリックします
5. 適切なインストール パスを選択します (注: スペースと漢字は使用できません。C ドライブにインストールすることはお勧めできません)。
6. コンポーネントを選択します。MSVC は、使用する前に対応する Visual Studio のバージョンと一致する必要があります。Qt5.14.2 は VS2015 と VS2017 のみをサポートします。
ここでは「MSVC 2017 64-bit」と「MinGW 7.3.0 64-bit」のみを選択しました(他のニーズがある場合は必要に応じて選択できます)
7.「次へ」をクリックしてインストールを待ちます
インストールに成功!
-
構成環境
1. QTのインストールパスとツールのパスを見つけてコピーします。
2. このコンピュータを右クリック -> プロパティ -> アドバンスト システム デザイン -> 環境変数 -> パスをダブルクリック -> Qt インストール パスとツール パスを環境変数に追加します。
この時点で、環境変数は正常に構成されました。
2. 新しいプロジェクトを作成する
QT メイン インターフェイスに入ると、左側にようこそインターフェイス、ファイル編集インターフェイス、ビジュアル ウィンドウ編集インターフェイス、デバッグ インターフェイス、プロジェクト プロパティ設定インターフェイス、およびヘルプ インターフェイスがあることがわかります。次のように:
1. ようこそインターフェイスに切り替え、クリックして新しいプロジェクトを作成し、最初の「QT Widgets Application」を選択します。右下隅の「選択」をクリックします
(ウィジェットとはコンポーネント、ウィジェット アプリケーション コンポーネント アプリケーションを意味します)
2. プロジェクト名を入力します。スペースが入らないように注意し、プロジェクトの場所に中国語の名前が含まれないようにして、「次へ」をクリックします。
3. コンパイル システムのデフォルトは次のとおりです。
4. クラスに自分で名前を付けます。
QT には、QMainWindow、QWidget、QDialog の 3 つの基本クラスがあります。
QMainWindow: メニュー バーとステータス バーを提供するアプリケーション ウィンドウ
QWidget: すべてのユーザー インターフェイス オブジェクトの基本クラス、空白のウィンドウ
QDialog: ダイアログ ボックスの基本クラス。主にメッセージを送信するために使用される対話型ウィンドウです。
ここで QWidget を選択できます。
5. 言語を選択します
6. コンパイル環境の選択
7.「完了」をクリックします。
8. 「実行」をクリックします。空白のインターフェースが表示された場合は、新しいプロジェクトが成功したことを意味します。
3. 画像のスケーリング
準備作業がついに完了したので、正式にコードを書き始めることができます。
その前に、まず QT のファイル構造を理解して、編集インターフェイスに切り替えましょう
私たちのコードは主にウィンドウ クラスのソース ファイルとウィンドウ クラスのヘッダー ファイルに記述されます。
コードを書く前に、まず信号とスロット (スロット) という重要な概念を理解しましょう。
シグナルとスロットは、2 つのオブジェクト間の通信に使用されます。特別なことが起こったとき、シグナルを発行できます。たとえば、ボタンがクリックされると、 clicked() シグナルが発行されます。スロットは、シグナルが発行された後にシグナルに応答するために呼び出される関数です。
アプリケーションのシグナルとスロットのメカニズムをさらに理解しましょう。
以下は、ウィンドウ ヘッダー ファイルとウィンドウ ソース ファイルの基本的なコードの説明です。
#ifndef WIDGET_H //防止重复定义
#define WIDGET_H
#include <QWidget> //包含Qt的QWidget类的头文件
QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE
class Widget : public QWidget
{
Q_OBJECT //允许使用信号和槽机制
public:
Widget(QWidget *parent = nullptr); //类的构造函数
~Widget(); //析构函数
private:
Ui::Widget *ui; //把Ui::Widget作为一个私有类,可以通过它来访问在Qt设计师中设计的窗口部件
};
#endif // WIDGET_H
画像処理
- 画像のスケーリング
画像処理を実行するには、まず画像の表示、画像の処理、ボタンの作成のためのヘッダー ファイルを追加する必要があります。
次に、それぞれ画像の表示と画像の保存に使用される Qlabel オブジェクトと QImage オブジェクトのポインタを説明し、拡大ボタンと縮小ボタンを宣言します。
最後に、シグナルに接続するための応答関数を宣言するプライベート スロットを定義します。
(スロットはパブリック スロット、保護スロット、プライベート スロットの 3 つのカテゴリに分類されます。対応する違いは自分で理解できます)
コードは次のとおりです。
widget.cpp のコンストラクターで、label、img、およびズームインおよびズームアウトのボタンをインスタンス化する必要があります。同時にズームインボタンとズームアウトボタンの応答関数をコンストラクタの外側で定義します。具体的なコードは次のとおりです。#ifndef WIDGET_H #define WIDGET_H #include <QWidget> //窗口组件 #include <QLabel> //显示图片 #include <QImage> //处理图像 #include <QPushButton> //创建按钮 QT_BEGIN_NAMESPACE namespace Ui { class Widget; } QT_END_NAMESPACE class Widget : public QWidget { Q_OBJECT public: Widget(QWidget *parent = nullptr); ~Widget(); private: Ui::Widget *ui; private: QLabel *label; QImage *img; QPushButton *bigBt; //放大按钮 QPushButton *smallBt; //缩小按钮 private slots: //私有槽:只有类自己可以将信号与之相连接 void bShow(); //放大 void sShow(); //缩小 }; #endif // WIDGET_H
#include "widget.h" #include "ui_widget.h" Widget::Widget(QWidget *parent) : QWidget(parent) , ui(new Ui::Widget) { ui->setupUi(this); //实例 QLabel label = new QLabel(this); label->setGeometry(QRect(160,50,500,500)); //放置控件位置,x,y,宽,高 //实例QImage img = new QImage; //QImage加载图片 img->load("S:/VStudio/image/1.bmp"); //label显示图片 label->setPixmap(QPixmap::fromImage(*img)); //QPixmap类是一种图像表示形式,可以用作绘画设备 //实例放大按钮 bigBt = new QPushButton(this); bigBt->setGeometry(QRect(50,100,100,25)); //设置按钮位置和大小 bigBt->setText("放大"); connect(bigBt,SIGNAL(clicked()),this,SLOT(bShow())); //使用connect()函数连接按钮的clicked()信号到窗口的bShow()槽函数 //表明用户在单机该按钮时,会触发bShow()槽函数执行操作 //实例缩小按钮 smallBt = new QPushButton(this); smallBt->setGeometry(QRect(50,150,100,25)); smallBt->setText("缩小"); connect(smallBt,SIGNAL(clicked()),this,SLOT(sShow())); } //放大操作 void Widget::bShow() { *img = img->scaled(600,600,Qt::IgnoreAspectRatio); label->setPixmap(QPixmap::fromImage(*img)); //绘制图像 } //缩小操作 void Widget::sShow() { *img = img->scaled(100,100,Qt::IgnoreAspectRatio); label->setPixmap(QPixmap::fromImage(*img)); //绘制图像 } Widget::~Widget() { delete ui; }
実現効果:
概要:
ボタンと応答関数は .h で宣言する必要があり、ボタンと応答関数は .cpp でインスタンス化して定義する必要があります。
このアイデアに従って、移動ボタン、垂直反転ボタン、水平反転ボタン、角度反転ボタン、明るさ調整ボタン、グレースケール ボタンなどを追加できます。方法とアイデアは画像縮小ボタンと一致します。ここではキー コードのみを提供します
。 :
private:
QLabel *label;
QImage *img;
QPushButton *bigBt; //放大按钮
QPushButton *smallBt; //缩小按钮
QPushButton *move; //移动按钮
QPushButton *Vflip; //垂直翻转按钮
QPushButton *Hflip; //水平翻转按钮
QPushButton *Dflip; //角度翻转按钮
QPushButton *bright; //亮度调节按钮
private slots: //私有槽:只有类自己可以将信号与之相连接
void on_pushButton_clicked();
void bShow(); //放大
void sShow(); //缩小
void moveImg(); //移动
void hshow(); //水平翻转
void vShow(); //垂直翻转
void angleShow(); //角度操作
Widget::Widget(QWidget *parent) //父窗口指针
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
//实例 QLabel
label = new QLabel(this);
label->setGeometry(QRect(160,50,500,500)); //放置控件位置,x,y,宽,高
//实例QImage
img = new QImage;
//QImage加载图片
img->load("S:/VStudio/image/1.bmp");
//label显示图片
label->setPixmap(QPixmap::fromImage(*img)); //QPixmap类是一种图像表示形式,可以用作绘画设备
//实例放大按钮
bigBt = new QPushButton(this);
bigBt->setGeometry(QRect(50,100,100,25)); //设置按钮位置和大小
bigBt->setText("放大");
connect(bigBt,SIGNAL(clicked()),this,SLOT(bShow())); //使用connect()函数连接按钮的clicked()信号到窗口的bShow()槽函数
//表明用户在单机该按钮时,会触发bShow()槽函数执行操作
//实例缩小按钮
smallBt = new QPushButton(this);
smallBt->setGeometry(QRect(50,150,100,25));
smallBt->setText("缩小");
connect(smallBt,SIGNAL(clicked()),this,SLOT(sShow()));
//实例移动按钮
move = new QPushButton(this);
move->setGeometry(QRect(50,200,100,25));
move->setText("移动");
connect(move,SIGNAL(clicked()),this,SLOT(moveImg()));
//实例垂直翻转按钮
Vflip = new QPushButton(this);
Vflip->setGeometry(QRect(50,250,100,25));
Vflip->setText("垂直翻转");
connect(Vflip,SIGNAL(clicked()),this,SLOT(vShow()));
//实例水平翻转按钮
Hflip = new QPushButton(this);
Hflip->setGeometry(QRect(50,300,100,25));
Hflip->setText("水平翻转");
connect(Hflip,SIGNAL(clicked()),this,SLOT(hshow()));
//实例角度翻转按钮
Dflip = new QPushButton(this);
Dflip->setGeometry(QRect(50,350,100,25));
Dflip->setText("角度翻转");
connect(Dflip,SIGNAL(clicked()),this,SLOT(angleShow()));
}
//放大操作
void Widget::bShow()
{
*img = img->scaled(600,600,Qt::IgnoreAspectRatio);
label->setPixmap(QPixmap::fromImage(*img)); //绘制图像
}
//缩小操作
void Widget::sShow()
{
*img = img->scaled(100,100,Qt::IgnoreAspectRatio);
label->setPixmap(QPixmap::fromImage(*img)); //绘制图像
}
//点击移动
int i=50;
void Widget::moveImg()
{
//移动label控件
label->move(i,50); //修改控件位置
i+=10; //每次移动10像素
}
//垂直翻转
void Widget::vShow()
{
*img = img->mirrored(false,true); //水平翻转false,垂直翻转true
label->setPixmap(QPixmap::fromImage(*img));
}
//水平翻转
void Widget::hshow()
{
*img = img->mirrored(true,false);
label->setPixmap(QPixmap::fromImage(*img));
}
//角度操作
void Widget::angleShow()
{
QMatrix matrix;
//88度
matrix.rotate(88);
*img = img->transformed(matrix);
label->setPixmap(QPixmap::fromImage(*img));
}
実現効果:
ここまでで、最も基本的な画像処理が完了しました。しかし、まだ改善の余地がたくさんあります。たとえば、画像のグレースケールや明るさを調整したり、見た目が良くなるようにインターフェイスをデザインしたり、画像の拡大縮小効果を改善したりするなどです。後で時間があれば、引き続き改善していきます
。