顯示具有 Qt 標籤的文章。 顯示所有文章
顯示具有 Qt 標籤的文章。 顯示所有文章

2021年6月28日 星期一

[教學]在QT中新增菜單

 標題:[教學]在QT中新增菜單

本篇文章網址:https://corettainformation.blogspot.com/2021/06/qt.html


//首先,建立一條MenuBar

//調用QMainWidow的成員函數menuBar後,只要將表單新增進去就能添加到QMainWidow中。

QMenuBar* mb = menuBar();

//接著新增一個Menu菜單,上面寫檔案

QMenu* menu = new QMenu("檔案(&F)");

//建立菜單的第二層,上面寫New

QAction* action = new QAction("New", NULL);

//將第二層菜單加入第一層菜單項中

menu->addAction(action); 

//綁定按下後要執行的函數(kaleido_painter::open),這行可省略或自行更改。

connect(action, &QAction::triggered, this, &kaleido_painter::open);

 //將菜單項加入MenuBar中

mb->addMenu(menu); 


結果如下:




在QT的connect傳入函數的參數

標題:在QT的connect傳入函數的參數

關鍵字:QT、connect、parameter

本篇文章網址:https://corettainformation.blogspot.com/2021/06/qtconnect.html


今天使用C++寫QT程式時,想要讓QT按下清單時可以執行showSecondary_Window函數,然後又要傳mosaic_Window的參數進去。


本來程式碼是長這個樣子的:

action = new QAction("馬賽克", NULL);

menu->addAction(action); 

connect(action, &QAction::triggered, this, &kaleido_painter::showSecondary_Window);

它可以呼叫showSecondary_Window函數,但是不能傳入任何參數。


怎麼辦呢?

只要把connect函數改成下方的格式就可以了:

connect(action, &QAction::triggered, this, [=]() {

kaleido_painter::showSecondary_Window(mosaic_Window);

});


這樣就能同時呼叫showSecondary_Window函數又能傳mosaic_Window的參數進去

2021年5月7日 星期五

[教學]如何在QT中顯示中文

標題:[教學]如何在QT中顯示中文

或 [教學]如何在QT中解決中文亂碼問題


本篇文章網址:https://corettainformation.blogspot.com/2021/05/qt.html


直接進入正題吧,今天,我在QMenu上顯示「檔案」兩個字。

但是卻出現亂碼(如下圖所示)


如何解決呢,很簡單,只要在程式碼中加入下方這段code即可。

#ifdef WIN32  

#pragma execution_character_set("utf-8")  

#endif


加入完後,重新編譯程式。



「檔案」兩個字就被顯示出來了。

2021年1月13日 星期三

[範例]如何在QT中顯示OpenCV開啟的影像

標題:[範例]如何在QT中顯示OpenCV開啟的影像

本篇以Visual Studio 2019做範例。


首先,你的Visual Studio 2019要先安裝好QT和OpenCV。

可以參考以下兩篇文章:


確定安裝好之後,建立一份QT專案。

然後按專案/[專案名稱]屬性。 (我懶得重新截圖,所以用舊圖)



找到VC++目錄的地方。

在Include目錄之後加上 ;C:\opencv\build\include

在程式庫目錄之後加上 ;C:\opencv\build\x64\vc15\lib

注意,前後要用「;」區隔。


然後你去C:\opencv\build\x64\vc15\lib。

找到類似opencv_world451.lib的東西,把檔名複製起來。

如果你的專案是debug模式,就要複製檔名後面有個d的,就是opencv_world451d.lib。

如果你的專案是release模式,就要複製opencv_world451.lib。


然後回到剛剛的屬性頁。

按連接器/輸入。
在其他相依性的地方加入剛剛複製的opencv_world451.lib。
因為我現在是debug模式,所以是opencv_world451d.lib。
注意,前後要用「;」區隔。



接下來要打程式碼了,在這個QT專案找到一個繼承QMainWindow的class。

它的位置應該在[專案名稱].h的地方。

我的專案名稱是kaleido_painter,所以是kaleido_painter.h。


然後在裡面的public之類的地方加入這段:

void paintEvent(QPaintEvent*);



範例:(kaleido_painter是我的專案名稱,請更改為自己的)
(新增的程式碼片段為紅色處)

class kaleido_painter : public QMainWindow
{
    Q_OBJECT

public:
    kaleido_painter(QWidget *parent = Q_NULLPTR);
    void paintEvent(QPaintEvent*);

private:
    Ui::kaleido_painterClass ui;
};

然後到main.cpp的地方,引入以下套件及名稱空間:

#include <QtWidgets/QApplication>
#include <QWidget>
#include <QPainter>
#include <QPen>
#include <QBuffer>
#include<opencv2/opencv.hpp>
using namespace cv;

並在main函數的上方填入以下程式碼:

範例:(kaleido_painter是我的專案名稱,請更改為自己的)
記得紅色的檔名處要改成你的圖片路徑。
void kaleido_painter::paintEvent(QPaintEvent* event)
{
Q_UNUSED(event);
QPainter painter(this);
Mat img = imread("C:/ckey/0.jpg", -1);
QImage* myImage = new QImage;
*myImage = QImage((unsigned char*)img.data, img.cols, img.rows, img.step, QImage::Format_RGB888);
painter.drawImage(QRect(30, 50, 500, 300), *myImage);
}

輸入完後按下執行。

會看到我那超讚的立華奏彈鋼琴圖被畫到QT上去了,但顏色怪怪的。

那是因為OpenCV讀取到的影像的顏色順序是BGR,而QT的QImage讀取顏色的順序則是RGB,怎麼處理呢,有兩個方法。

方法一:
使用 cv::cvtColor(img, img, cv::COLOR_BGR2RGB);


使用OpenCV的cvtColor語法將BGR轉成RGB。

更改後的語法如下(深紅色處):
void kaleido_painter::paintEvent(QPaintEvent* event)
{
Q_UNUSED(event);
QPainter painter(this);
Mat img = imread("C:/ckey/0.jpg", -1);
cv::cvtColor(img, img, cv::COLOR_BGR2RGB);
QImage* myImage = new QImage;
*myImage = QImage((unsigned char*)img.data, img.cols, img.rows, img.step, QImage::Format_RGB888);
painter.drawImage(QRect(30, 50, 500, 300), *myImage);
}

第二個方法則是改變QImage的格式,將Format_RGB888改成Format_BGR888。
更改後的語法如下(深紅色處):
void kaleido_painter::paintEvent(QPaintEvent* event)
{
Q_UNUSED(event);
QPainter painter(this);
Mat img = imread("C:/ckey/0.jpg", -1);
QImage* myImage = new QImage;
*myImage = QImage((unsigned char*)img.data, img.cols, img.rows, img.step, QImage::Format_BGR888);
painter.drawImage(QRect(30, 50, 500, 300), *myImage);
}

使用這兩種方法的任一一種更改完後,我那張超讚的立華奏的圖就被以正常的色彩畫到QT的視窗上去了。


=====分隔線=====
如果覺得立華奏很讚,或這篇文有幫助到你們的話,請留言或幫忙按個廣告吧。

您的支持是我寫文的最大動力。

如果失敗了,也請留言讓我知道,看看哪個環節出了問題,我有看到就會回。


希望這篇文有幫助到各位ξ( ✿>◡❛)

[範例]如何在QT中顯示圖片

 標題:[範例]如何在QT中顯示圖片


本篇以Visual Studio 2019做範例。

首先建立一份QT專案後,找到一個繼承QMainWindow的class。

它的位置應該在[專案名稱].h的地方。

我的專案名稱是kaleido_painter,所以是kaleido_painter.h。


然後在裡面的public之類的地方加入這段:

void paintEvent(QPaintEvent*);



範例:(kaleido_painter是我的專案名稱,請更改為自己的)

(增加的程式碼片段為紅色處)

class kaleido_painter : public QMainWindow

{

    Q_OBJECT

public:

    kaleido_painter(QWidget *parent = Q_NULLPTR);

    void paintEvent(QPaintEvent*);

private:

    Ui::kaleido_painterClass ui;

};


然後到main.cpp的地方,引入一個套件:

#include <QPainter>


並在main函數的上方填入以下程式碼:


範例:(kaleido_painter是我的專案名稱,請更改為自己的)
記得紅色的檔名處要改成你的圖片路徑。

void kaleido_painter::paintEvent(QPaintEvent* event)

{

Q_UNUSED(event);

QPainter painter(this);

QImage myImage;

myImage.load("C:/ckey/0.jpg");

painter.drawImage(QRect(30, 50, 500, 300), myImage);

}

輸入完後按下執行。


就會看到我那張超讚的立華奏的圖被畫到QT的視窗上去了。


如果覺得立華奏很讚,或這篇文有幫助到你們的話,請留言或幫忙按個廣告吧。

您的支持是我寫文的最大動力。

如果失敗了,也請留言讓我知道,看看哪個環節出了問題,我有看到就會回。


希望這篇文有幫助到各位ξ( ✿>◡❛)

[範例]如何在QT中使用QPainter

標題:[範例]如何在QT中使用QPainter。

本篇以Visual Studio 2019做範例。


首先建立一份QT專案後,找到一個繼承QMainWindow的class。

它的位置應該在[專案名稱].h的地方。

我的專案名稱是kaleido_painter,所以是kaleido_painter.h。


然後在裡面的public之類的地方加入這段:

void paintEvent(QPaintEvent*);



範例:(kaleido_painter是我的專案名稱,請更改為自己的)

class kaleido_painter : public QMainWindow

{

    Q_OBJECT

public:

    kaleido_painter(QWidget *parent = Q_NULLPTR);

    void paintEvent(QPaintEvent*);

private:

    Ui::kaleido_painterClass ui;

};


然後到main.cpp的地方,引入兩個套件:

#include <QPainter>

#include <QPen>


並在main函數的上方填入以下程式碼:


範例:(kaleido_painter是我的專案名稱,請更改為自己的)

void kaleido_painter::paintEvent(QPaintEvent* event)

{

    Q_UNUSED(event);

    QPainter painter(this);

    painter.setRenderHint(QPainter::Antialiasing, true);

    painter.setPen(QColor(0, 140, 250));

    painter.drawLine(QPointF(0,0), QPointF(100, 150));

}


QColor是RGB的值。

兩個QPointF分別為起始點和終點的座標。


然後按下執行:



就會看到一條線被畫上去了。

2021年1月1日 星期五

[解決]執行QT 出現 「內嵌變數至少需要 '/std:c++17'」的錯誤

標題:解決Visual Studio 執行QT 出現 「內嵌變數至少需要 '/std:c++17'」的錯誤。

副標題:解決Visual Studio 執行QT 出現 「無法由initializer list轉換為qbytearrayview」的錯誤。


前些日子在安裝好QT後,在Visual Studio上執行它,結果出現以下錯誤:


「內嵌變數至少需要 '/std:c++17'」
或者是「無法由initializer list轉換為qbytearrayview」

如何解決呢,首先,按 「專案 」 / 「屬性」 / 「C/C+」 / 「語言」。


將「C++語言標準」從「ISO C++ 14標準」更改為「ISO C++ 17標準」。


更改完之後,重新執行一次QT程式,就會發現程式已經可以執行了。


如果覺得這篇文有幫助到你們的話,請留言或幫忙按個廣告吧。

您的支持是我寫文的最大動力。

如果依然失敗了,也請留言讓我知道,看看哪個環節出了問題,我有看到就會回。



希望這篇文有幫助到各位ξ( ✿>◡❛)

2020年6月19日 星期五

[解決方法]Visual Studio不能執行Qt 64位元Release的問題

之前在Visual Studio上編譯QT 64位元Release的程式時出了各種錯誤。
各種錯誤訊息包含:
  • this application failed to start because it could not find or load the qt platform plugin windows
  • 未載入ucrtbase.pdb
  • 正在從下列位置載入ucrtbase.pdb的符號:Microsoft符號伺服器
之類的,



這是因為缺少了部分的QT元件(例如dll檔)

解決方法:
首先,我們先在不偵錯的情況下建置QT程式:


然後開啟專案的資料夾確認該程式存在

然後,現在是主要的解法,QT裡面有個windeployqt.exe檔案可以解決該程式缺少元件的問題。
目前windeployqt.ex在我的電腦中的位置為:
C:\Qt\5.13.1\msvc2017_64\bin\windeployqt.exe
而編譯後的程式在我的電腦中的位置為:
C:\Users\user\source\repos\QtWidgetsApplication5\x64\Release

我們就直接開啟cmd輸入:
C:\Qt\5.13.1\msvc2017_64\bin\windeployqt.exe  C:\Users\user\source\repos\QtWidgetsApplication5\x64\Release

然後按下enter:

執行完後就會發現,缺少的元件已經自動被加入該目錄以下。

再次執行程式後,就會發現程式已經可以開啟了。

如果覺得這篇文有幫助到你們的話,請留言或幫忙按個廣告吧。

您的支持是我寫文的最大動力。

如果依然失敗了,也請留言讓我知道,看看哪個環節出了問題,我有看到就會回。


希望這篇文有幫助到各位ξ( ✿>◡❛)

[解決方法] Visual Studio的「未正確載入套件 'Vsix'」錯誤

最近在替Visual Studio安裝QT時,看到「未正確載入套件 'Vsix'」的錯誤。


並且在刪除
 C:\Users\<username>\AppData\Local\Microsoft\VisualStudio\<version>\ComponentModelCache
的資料後,依然無法解決問題。

解決方法:
開啟Visual Studio Installer,更新Visual Studio後重開機,便能解決此錯誤。

2019年6月30日 星期日

在Visual Studio 2019上安裝Qt

在撰寫Qt程式時不一定需要使用Qt Creator,Visual Studio也是可以的,本章節將示範如何在Visual Studio上安裝Qt。

首先去Qt的官方網站: https://www.qt.io/
按下中間大大的綠色按鈕(Start free Qt trial)

我們選擇右邊的Open Source的部分。

按下最下方的Go open source按鈕。

然後就會下載一個Qt的安裝檔。

開啟之後會進入安裝界面

按Next之後,會開始初始化安裝。

按skip

按Next

選擇要安裝的目的資料夾之後,按Next 

疑,好像沒有MSVC 2019的版本,沒關係,2017的版本也可以安裝在Visual Studio 2019上。
如果電腦是64位元的,可以選擇(MSVC 2017 64-bit)版本。
按Next

詳細閱讀之後點選接受並按下Next

按Next

按下Install,開始安裝 

等它安裝完,需要一點時間(我記得我大概等了十分鐘吧)

安裝完後按Finish,上面的Launch Qt Creater可以勾消掉

然後我們啟動Visual Studio 2019,按選單的延伸模組/管理延伸模組

在右上角的搜尋框搜尋Qt,然後對(Qt Visual Studio Tools)按下Download

等它下載完

接著關掉Visual Studio,它會跑出這個東西,按下Modify

再稍等一會兒

修改完成

重新開啟Visual Studio,對選單的延伸模組按下去,選擇/Qt VS Tools/Qt Options

按下右側的Add,Version name填想要的名稱,路徑選擇剛剛安裝時的資料夾/版本號/msvc2017_64,按下OK

選擇剛剛字定的名稱,再次按下OK
註:因為我之前就安裝過了,所以圖片中有兩個選項。

接著重開Visual Studio,到建立新專案的介面,選擇Qt GUI Application,按下一步

設定完成之後,按下建立

按Next

勾選需要的套件,按Next

設定完成之後,按Finish

接著會出現Qt相關的程式碼,在這裡就可以開始寫Qt程式了,在開始寫之前先測試看看有沒有問題,我們按下綠色箭頭。

執行程式之後如果跑出Qt視窗,恭喜你,安裝成功了。

疑難排解:
若出現64位元Release不能編譯的問題請參見:

[解決方法]Visual Studio不能執行Qt 64位元Release的問題


若開啟Visual Studio出現「未正確載入套件 'Vsix'」的錯誤請參見:

[解決方法] Visual Studio的「未正確載入套件 'Vsix'」錯誤


若出現「內嵌變數至少需要 '/std:c++17'」或「無法由initializer list轉換為qbytearrayview」的錯誤請參見:

[解決]執行QT 出現 「內嵌變數至少需要 '/std:c++17'」的錯誤


=====分隔線=====
如果覺得這篇文有幫助到你們的話,請留言或幫忙按個廣告吧。

您的支持是我寫文的最大動力。

如果依然失敗了,也請留言讓我知道,看看哪個環節出了問題,我有看到就會回。


希望這篇文有幫助到各位ξ( ✿>◡❛)