QT :QString 的getOpenFileName 方法打开文件时路径时 汉字部分显示乱码

QT :QString 的getOpenFileName 方法打开文件时路径时 汉字部分显示乱码,第1张

fileName=fileDialog->selectedFiles()[0]

code = QTextCodec:: codecForName("gb18030")

std::string strbuffer

strbuffer = code->fromUnicode(fileName).data()

同逗激改时要铅锋加上头文件#include <QTextCodec>。

qt中有自带的中文字符编码方山判式。

程序解析:

1、windows.h是每兄备逗一个Windows程序都需要的头文件。

2、WinMain函数是所有Windows C程序的入口,类似于DOS C中的main函数。

3、MessageBox是一个Win32 API函数(API,Application Programming Interface 应用程序接口),其作用是d出一个对话框,显示消息的内容。该函数的第一个参数是用来指定父窗口句柄,即对话框所在的窗口句柄。第二个参数是用来显示消息的内容(你可以修改成你想显示的内容)。第三个参数是 对话框标的标题,如本例的“我的第一个Windows程序”,第四个参数是指定对话框中显示的按钮,试一试,将MB_OK修改成MB_OKCANCEL,运行一下程序会出现什么结果,再试一试修改成MB_RETRYCANCEL

二、Windows 程序简介

(1)Windows C程序滚漏的组成:

1.C程序源文件,扩展名为.c或.cpp

2.头文件,扩展名为.h

3.资源文件,扩展名为.rc

(2)源程序的组成结构

Windows C程序有相对固定的基本结构,一般有入口函数WinMain和窗口函数。

1、WinMain函数

是所有Windows C程序的入口,类似于DOS C的main函数,其功能是完成一系列的定义和初始化工作,并产生消息循环。消息循环是整个程序运行的核心。

WinMain函数有三个基本的组成部分:函数说明、初始化和消息循环

a、WinMain函数的说明:

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,PSTR szCmdLine, int iCmdShow)

参数说明:

hInstance 应用程序当前实例句柄

hPrevInstance前一个实例句柄,在32位系统中该参数永远是NULL

szCmdLine程序运行时的命令行参数

iCmdShow程序运行时的显示方式,如最大化、最小化、隐藏显示等。

b、初始化

初始化包括窗口类的定义、注册、创建窗口实例和显示窗口四部分。

这是固定格式,所有的Windows程序基本一样,记住即可,具体参见下面的程羡卖序实例的注释。

2、窗口函数

窗口函数定义了Windows C程序对接受到的不同消息的响应,其中包含了应用程序对各种可能接收到的消息的处理过程,是消息处理分支控制语句的集合。通常窗口函数是有一个或多个switch语句组成。每一条case语句对应一种消息,当应用程序接收到一个消息时,就会执行相应case 语句下的程序模块来完成相应的功能。

窗口函数说明:

LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)

参数说明:

hwnd 窗口句柄

message 代表所处理消息的消息值

wParam 消息的附加参数,是message的进一步信息

lParam 消息的附加参数,是message的进一步信息

一般用法:

LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)

{

...

switch (message)

{

case 常数1:

...

case 常数2:

...

...

case WM_DESTROY:

PostQuitMessage (0) //在消息队列中插入一条“退出”消息

return 0

}

return DefWindowProc (hwnd, message, wParam, lParam)//执行默认的消息处理

}

窗口函数的主体是消息处理语句,该语句是有一系列case语句组成。我们学习者自需要根据窗口可能收到的消息在case语句中编写相应的处理程序即可。

1.记事本主程序

#include <windows.h>

#include "sample.h"

static char g_szClassName[] = "MyWindowClass"

static HINSTANCE g_hInst = NULL

#define IDC_MAIN_TEXT 1001

BOOL LoadFile(HWND hEdit, LPSTR pszFileName)

{

HANDLE hFile

BOOL bSuccess = FALSE

hFile = CreateFile(pszFileName, GENERIC_READ, FILE_SHARE_READ, NULL,

OPEN_EXISTING, 0, 0)

if(hFile != INVALID_HANDLE_VALUE)

{

DWORD dwFileSize

dwFileSize = GetFileSize(hFile, NULL)

if(dwFileSize != 0xFFFFFFFF)

{

LPSTR pszFileText

pszFileText = (LPSTR)GlobalAlloc(GPTR, dwFileSize + 1)

if(pszFileText != NULL)

{

DWORD dwRead

if(ReadFile(hFile, pszFileText, dwFileSize, &dwRead, NULL))

{

pszFileText[dwFileSize] = 0

if(SetWindowText(hEdit, pszFileText))

bSuccess = TRUE

}

GlobalFree(pszFileText)

}

}

CloseHandle(hFile)

}

return bSuccess

}

BOOL SaveFile(HWND hEdit, LPSTR pszFileName)

{

HANDLE hFile

BOOL bSuccess = FALSE

hFile = CreateFile(pszFileName, GENERIC_WRITE, 0, 0,

CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0)

if(hFile != INVALID_HANDLE_VALUE)

{

DWORD dwTextLength

dwTextLength = GetWindowTextLength(hEdit)

if(dwTextLength >0)

{

LPSTR pszText

pszText = (LPSTR)GlobalAlloc(GPTR, dwTextLength + 1)

if(pszText != NULL)

{

if(GetWindowText(hEdit, pszText, dwTextLength + 1))

{

DWORD dwWritten

if(WriteFile(hFile, pszText, dwTextLength, &dwWritten, NULL))

bSuccess = TRUE

}

GlobalFree(pszText)

}

}

CloseHandle(hFile)

}

return bSuccess

}

BOOL DoFileOpenSave(HWND hwnd, BOOL bSave)

{

OPENFILENAME ofn

char szFileName[MAX_PATH]

ZeroMemory(&ofn, sizeof(ofn))

szFileName[0] = 0

ofn.lStructSize = sizeof(ofn)

ofn.hwndOwner = hwnd

ofn.lpstrFilter = "文本文件 (*.txt)\0*.txt\0所有文件 (*.*)\0*.*\0\0"

ofn.lpstrFile = szFileName

ofn.nMaxFile = MAX_PATH

ofn.lpstrDefExt = "txt"

if(bSave)

{

ofn.Flags = OFN_EXPLORER | OFN_PATHMUSTEXIST | OFN_HIDEREADONLY |

OFN_OVERWRITEPROMPT

if(GetSaveFileName(&ofn))

{

if(!SaveFile(GetDlgItem(hwnd, IDC_MAIN_TEXT), szFileName))

{

MessageBox(hwnd, "保存文件失败.", "错误信息",

MB_OK | MB_ICONEXCLAMATION)

return FALSE

}

}

}

else

{

ofn.Flags = OFN_EXPLORER | OFN_FILEMUSTEXIST | OFN_HIDEREADONLY

if(GetOpenFileName(&ofn))

{

if(!LoadFile(GetDlgItem(hwnd, IDC_MAIN_TEXT), szFileName))

{

MessageBox(hwnd, "打开文件失败.", "错误信息",

MB_OK | MB_ICONEXCLAMATION)

return FALSE

}

}

}

return TRUE

}

LRESULT CALLBACK WndProc(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lParam)

{

switch(Message)

{

case WM_CREATE:

CreateWindow("EDIT", "",

WS_CHILD | WS_VISIBLE | WS_HSCROLL | WS_VSCROLL | ES_MULTILINE |

ES_WANTRETURN,

CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,

hwnd, (HMENU)IDC_MAIN_TEXT, g_hInst, NULL)

SendDlgItemMessage(hwnd, IDC_MAIN_TEXT, WM_SETFONT,

(WPARAM)GetStockObject(DEFAULT_GUI_FONT), MAKELPARAM(TRUE, 0))

break

case WM_SIZE:

if(wParam != SIZE_MINIMIZED)

MoveWindow(GetDlgItem(hwnd, IDC_MAIN_TEXT), 0, 0, LOWORD(lParam),

HIWORD(lParam), TRUE)

break

case WM_SETFOCUS:

SetFocus(GetDlgItem(hwnd, IDC_MAIN_TEXT))

break

case WM_COMMAND:

switch(LOWORD(wParam))

{

case CM_FILE_OPEN:

DoFileOpenSave(hwnd, FALSE)

break

case CM_FILE_SAVEAS:

DoFileOpenSave(hwnd, TRUE)

break

case CM_FILE_EXIT:

PostMessage(hwnd, WM_CLOSE, 0, 0)

break

case CM_ABOUT:

MessageBox (NULL, "一个Windows C 记事本程序" , "关于...", 0)

}

break

case WM_CLOSE:

DestroyWindow(hwnd)

break

case WM_DESTROY:

PostQuitMessage(0)

break

default:

return DefWindowProc(hwnd, Message, wParam, lParam)

}

return 0

}

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,

LPSTR lpCmdLine, int nCmdShow)

{

WNDCLASSEX WndClass

HWND hwnd

MSG Msg

g_hInst = hInstance

WndClass.cbSize= sizeof(WNDCLASSEX)

WndClass.style = 0

WndClass.lpfnWndProc = WndProc

WndClass.cbClsExtra= 0

WndClass.cbWndExtra= 0

WndClass.hInstance = g_hInst

WndClass.hIcon = LoadIcon(NULL, IDI_APPLICATION)

WndClass.hCursor = LoadCursor(NULL, IDC_ARROW)

WndClass.hbrBackground = (HBRUSH)(COLOR_WINDOW+1)

WndClass.lpszMenuName = "MAINMENU"

WndClass.lpszClassName = g_szClassName

WndClass.hIconSm = LoadIcon(NULL, IDI_APPLICATION)

if(!RegisterClassEx(&WndClass))

{

MessageBox(0, "注册窗口失败", "错误信息",

MB_ICONEXCLAMATION | MB_OK | MB_SYSTEMMODAL)

return 0

}

hwnd = CreateWindowEx(

WS_EX_CLIENTEDGE,

g_szClassName,

"一个记事本程序",

WS_OVERLAPPEDWINDOW,

CW_USEDEFAULT, CW_USEDEFAULT, 800, 600,

NULL, NULL, g_hInst, NULL)

if(hwnd == NULL)

{

MessageBox(0, "创建窗口失败", "错误信息",

MB_ICONEXCLAMATION | MB_OK | MB_SYSTEMMODAL)

return 0

}

ShowWindow(hwnd, nCmdShow)

UpdateWindow(hwnd)

while(GetMessage(&Msg, NULL, 0, 0))

{

TranslateMessage(&Msg)

DispatchMessage(&Msg)

}

return Msg.wParam

}

2.记事本头文件 sample.h

#define CM_FILE_SAVEAS9072

#define CM_FILE_EXIT9071

#define CM_FILE_OPEN9070

#define CM_ABOUT9069

3.记事本资源文件

#include "sample.h"

A ICON MOVEABLE PURE LOADONCALL DISCARDABLE "sample.ico"

MAINMENU MENU

{

POPUP "文件(&F)"

{

MENUITEM "打开(&O)...", CM_FILE_OPEN

MENUITEM "另存为(&S)...", CM_FILE_SAVEAS

MENUITEM SEPARATOR

MENUITEM "关闭", CM_FILE_EXIT

}

POPUP "帮助(&H)"

{

MENUITEM "关于(&A)", CM_ABOUT

}

}

一点经验

所有Windows 程序的基本结构都与上面的实例相同或相近(说明:有的程序是将窗口类和窗机窗口封装成函数后调用,其实质是一样的),记住一个例子,编写其他程序时,在其上面修改即可。

一点建议:由于Windows 编程精大博深,初学者想把什么都搞明白是不可能的,要学会一点“不求甚解” ,这里说的“不求甚解”并不是指不认真学习。初学者最怕钻牛角尖:一个问题不明白,就在那里卡住,非解决它不可——这种方法是不可取的。

首先,它会严重打击你的自信心,使你丧失继续学习下去的兴趣;

其次,这样浪费了许多时间。因此学习时要给自己留一些“不懂”的余地。例如第一遍读书时要允许自己似懂非懂,用规定的时间(例如两个星期)把它看完,然后开始第二遍学习。开始时许多不明白的东西,下次就容易理解多了。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/tougao/12310695.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-24
下一篇 2023-05-24

发表评论

登录后才能评论

评论列表(0条)

保存