qt与wxWidgets相互转换总结

https://monica.im/s/07e63109

映射总map

qt wxWidgets
QByteArray wxMemoryBuffer
QFile wxFile
QFileInfo wxFileName
QList wxArray
QPair std::pair
QRegExp wxRegEx
QStringList wxArrayString
QT wxWidgets
QString wxString
QObject wxObject
QVector wxArray
Q_ASSERT wxCheck
QList std::list

QByteArray与wxMemoryBuffer

QByteArray是Qt中一个用于处理字节序列的类,它提供了一些方便的方法来操作字节数组,如拼接、分割、查找、替换等。在wxWidgets中,相似的功能可以使用wxMemoryBuffer类实现。

wxMemoryBuffer类用于存储和管理字节序列,它提供了一些方法来增加、删除和访问字节序列,如AppendData()、RemoveLast()、GetData()等。与QByteArray不同的是,wxMemoryBuffer类的数据类型为void*,因此在使用时需要进行类型转换。

wxMemoryBuffer

#include 
#include 

int main(int argc, char* argv[])
{
    wxMemoryBuffer buffer;
    buffer.AppendData("Hello, world!", 13);
    
    char* data = (char*)buffer.GetData();
    
    wxLogMessage("buffer: %s", data);
    
    return 0;
}

在这个示例代码中,我们首先包含了wx/memory.h头文件,并定义了一个wxMemoryBuffer对象buffer。然后使用AppendData()方法向buffer中添加字节序列。接着使用GetData()方法获取buffer中的数据,并进行类型转换成char*类型。最后使用wxLogMessage()函数输出buffer中的数据。

当我们运行这个应用程序时,它将输出buffer中的数据,即"Hello, world!"。

wxMemoryBuffer转换为wxString

要将 wxMemoryBuffer 转换为 wxString,可以使用 wxMemoryBuffer::ToString() 方法。以下是一个示例代码:

wxMemoryBuffer buffer;

// 假设已经将数据写入了 wxMemoryBuffer 中

// 将 wxMemoryBuffer 转换为 wxString
wxString str = buffer.ToString();

在这个例子中,我们假设已经将数据写入了 wxMemoryBuffer 中。然后,使用 ToString() 方法将 wxMemoryBuffer 转换为 wxString。转换后的 wxString 对象将包含 wxMemoryBuffer 中的数据。

注意,wxMemoryBuffer::ToString() 方法默认将使用 UTF-8 编码将字节数据转换为字符串。如果数据不是以 UTF-8 编码存储的,可能需要使用适当的编码函数对字符串进行进一步处理。

QFile 与wxFile

qt代码:

QFile    f( path );
    wxString text = wxString();
    if( !f.exists() )
    {
        text += wxString( "\"%0\" do not exist!\n" ).arg( path );    
         return;
    }
    if( !f.open( QIODevice::ReadOnly | QIODevice::Text ) )
    {
        text += wxString( "\"%0\" open failed!\n" ).arg( path );
        return;
    }
    QByteArray arr = f.readAll(); 
    f.close();

这段代码的功能是读取一个文件的内容。在wxWidgets中,您可以使用wxFile类来执行类似的操作。下面是一个简单的示例代码,演示如何使用wxFile读取文件的内容:

#include 

void ReadFile(const wxString& path)
{
    wxFile file(path);
    wxString text;

    if (!file.IsOpened())
    {
        text += wxString::Format("\"%s\" do not exist!\n", path);
        return;
    }

    wxScopedCharBuffer buffer;
    if (file.ReadAll(&buffer))
    {
        text = wxString::FromUTF8(buffer);
    }
    else
    {
        text += wxString::Format("\"%s\" read failed!\n", path);
        return;
    }

    file.Close();
}

在这个例子中,我们使用wxFile类打开文件并检查文件是否打开成功。然后,我们使用ReadAll()方法读取文件的全部内容,并将其存储在一个wxScopedCharBuffer对象中。最后,我们将wxScopedCharBuffer对象中的内容转换为wxString。

QFile::copy

qt

QStringList filelist;
QFileInfo tempFi(filelist[j]);
            QFile::copy(filelist[j], "./" + tempFi.fileName());

wxWidgets:

 wxFileName tempFi( filelist.Item( j ) );        
        wxString destFile = "./" + tempFi.GetFullName();
        if( !wxCopyFile( filelist.Item( j ), destFile ) )
        {
            wxLogMessage( "Failed to copy file: %s", filelist.Item( j ) );
        }

QFile::rename

qt

QStringList filelist;
QFileInfo tempFi(filelist[j]);
        QFile::rename("./" + tempFi.fileName(), netlistDir + "/" + tempFi.fileName());

wxWidgets实现

wxArrayString filelist;
wxFileName tempFi( filelist.Item( j ) );
 wxString srcFilePath = wxString::FromUTF8( "./" ) + tempFi.GetFullName();
 wxString destFilePath = wxString::FromUTF8( netlistDir )
                                    + wxFileName::GetPathSeparator()
                                    + wxString::FromUTF8( tempFi.GetFullName() );
 wxRename( srcFilePath, destFilePath );

QFileInfo与wxFileName

代码示例1

qt代码:

QFileInfo tempFi(filelist[j]);
QFile::copy(filelist[j], "./" + tempFi.fileName());

转换为wxWidgets代码:

#include 
#include 
#include 

int main(int argc, char* argv[])
{
    wxString fileList[] = {"/path/to/file1.txt", "/path/to/file2.txt", "/path/to/file3.txt"};
    size_t count = sizeof(fileList) / sizeof(fileList[0]);
    
    for (size_t j = 0; j < count; j++)
    {
        wxFileName tempFi(fileList[j]);
        wxString destFile = "./" + tempFi.GetFullName();
        
        if (wxCopyFile(fileList[j], destFile))
        {
            wxLogMessage("File copied successfully: %s", destFile);
        }
        else
        {
            wxLogError("Failed to copy file: %s", fileList[j]);
        }
    }
    
    return 0;
}

在这个示例代码中,我们首先定义了一个包含多个文件路径的字符串数组fileList,并计算数组元素个数。然后使用for循环遍历数组元素,对于每个文件,使用wxFileName类创建一个tempFi对象,用于处理文件路径。接着构造目标文件路径destFile,并使用wxCopyFile()函数将源文件复制到目标文件。如果复制成功,使用wxLogMessage()函数输出成功信息;否则,使用wxLogError()函数输出失败信息。

当我们运行这个应用程序时,它将复制每个源文件到当前目录,并输出复制成功或失败的信息。

示例代码2

QT代码:

QFileInfo info(netlist);
    wxString projectName = "Output_" + info.baseName().remove("Netlist_");
    wxString netlistDir = info.absoluteDir().absolutePath();
    wxString outFile;

修改为wxWidgets代码:

#include 
#include 

int main(int argc, char* argv[])
{
    wxString netlist = "/path/to/Netlist_file.txt";
    
    wxFileName netlistFile(netlist);
    wxString projectName = "Output_" + netlistFile.GetName().Remove(0, 8);
    wxString netlistDir = netlistFile.GetPath();
    wxString outFile;
    
    wxLogMessage("projectName: %s", projectName);
    wxLogMessage("netlistDir: %s", netlistDir);
    
    return 0;
}

在这个示例代码中,我们首先包含了wx/filename.h头文件,并定义了一个字符串netlist,表示Netlist文件的路径。然后使用wxFileName类创建一个netlistFile对象,用于处理文件路径。接着使用GetName()方法获取文件名(不包括扩展名),并使用Remove()方法删除前8个字符,得到projectName。使用GetPath()方法获取文件所在目录的路径,并将其赋值给netlistDir。最后使用wxLogMessage()函数输出projectName和netlistDir的值。

当我们运行这个应用程序时,它将输出projectName和netlistDir的值,分别为"Output_file.txt"和"/path/to"。

总结:

QFileInfo wxFileName
函数名 fieName() GetFullName()
baseName() GetName()
absoluteDir().absolutePath() GetPath()

QList与wxArray

wxArrayString,wxArrayInt

QPair与std::pair

QPair是Qt中一个用于存储一对值的类,它提供了一些方便的方法来操作这对值,如获取第一个值、获取第二个值、设置第一个值、设置第二个值等。在wxWidgets中,相似的功能可以使用std::pair类实现。

std::pair类是C++标准库中的一个类模板,用于存储一对值。它提供了一些方法来访问和修改这对值,如first、second、operator=等。与QPair不同的是,std::pair类不是Qt库的一部分,而是C++标准库的一部分,因此无需包含任何头文件即可使用。

std::pair

#include 
#include 

int main(int argc, char* argv[])
{
    std::pair<std::string, int> myPair("hello", 42);
    
    std::cout << "myPair.first: " << myPair.first << std::endl;
    std::cout << "myPair.second: " << myPair.second << std::endl;
    
    myPair.first = "world";
    myPair.second = 123;
    
    std::cout << "myPair.first: " << myPair.first << std::endl;
    std::cout << "myPair.second: " << myPair.second << std::endl;
    
    return 0;
}

在这个示例代码中,我们首先包含了utility头文件,并定义了一个std::pair对象myPair,用于存储一个字符串和一个整数。然后使用first和second成员访问myPair对象的第一个和第二个值,并使用std::cout输出每个值。接着使用赋值运算符修改myPair对象的值,并再次使用std::cout输出每个值。

当我们运行这个应用程序时,它将输出myPair对象的每个值,并修改后再次输出每个值。

QRegExp与wxRegEx

QRegExp

在Qt中,QRegExp类是一个正则表达式类,提供了一些方法来匹配和操作字符串。其中,indexIn()方法用于在字符串中查找正则表达式的匹配项,并返回第一个匹配项的索引值。如果没有找到匹配项,则返回-1。cap()方法用于获取匹配项的子字符串。该方法接受一个整数参数,表示要获取的子字符串的索引值。索引值为0表示整个匹配项,而大于0的索引值表示匹配项中的子表达式。如果给定的索引值无效,则返回空字符串。下面是一个简单的示例代码,演示如何使用QRegExp类的indexIn()和cap()方法:

#include 
#include 
#include 

void FindAndPrint(const QString& str, const QString& pattern)
{
    QRegExp regex(pattern);
    int index = regex.indexIn(str);
    if (index != -1)
    {
        QString matchedText = regex.cap(0);
        QString subMatchedText = regex.cap(1);
        qDebug() << "Found match at index" << index << ":";
        qDebug() << "  Matched text:" << matchedText;
        qDebug() << "  Submatched text:" << subMatchedText;
    }
    else
    {
        qDebug() << "No match found for pattern" << pattern;
    }
}

在这个例子中,我们定义了一个名为FindAndPrint()的函数,该函数接受一个字符串和一个正则表达式作为参数。然后,我们使用QRegExp类创建一个正则表达式对象,并使用indexIn()方法在字符串中查找匹配项。如果找到了匹配项,则使用cap()方法获取匹配项和子表达式的子字符串,并将其记录到日志中。否则,我们将记录一条消息,表示没有找到匹配项。

wxRegEx

wxRegEx     regexStr( "[sS](\\d+)[pP]" );
        //std::smatch matchResult;
        if( regexStr.Compile( "[sS](\\d+)[pP]" ) )
        {
            if( regexStr.Matches( suf ) )
            {
                int count = regexStr.GetMatchCount();
                for( int i = 0; i < count; i++ )
                {
                    wxString match = regexStr.GetMatch( suf, i );
                    if( i == 1 )
                        match.ToInt( &( m_snpEntity->portNumber ) );
                }
            }
            else
            {
                wxLogMessage( "No match found." );
            }
        }
        else
        {
            wxLogMessage( "regexStr compile fail" );
        }

QStringList与wxArrayString

QStringList是Qt中一个用于存储字符串列表的类,它提供了一些方便的方法来操作字符串列表,如拼接、分割、查找、替换等。在wxWidgets中,相似的功能可以使用wxArrayString类实现。

wxArrayString类用于存储字符串列表,它提供了一些方法来增加、删除和访问字符串元素,如Add()、Remove()、Item()等。与QStringList不同的是,wxArrayString类的数据类型为wxString,因此在使用时无需进行类型转换。

wxArrayString类

#include 
#include 

int main(int argc, char* argv[])
{
    wxArrayString strList;
    strList.Add("apple");
    strList.Add("banana");
    strList.Add("orange");
    
    wxLogMessage("strList[0]: %s", strList.Item(0));
    wxLogMessage("strList[1]: %s", strList.Item(1));
    wxLogMessage("strList[2]: %s", strList.Item(2));
    
    return 0;
}

在这个示例代码中,我们首先包含了wx/arrstr.h头文件,并定义了一个wxArrayString对象strList。然后使用Add()方法向strList中添加多个字符串元素。接着使用Item()方法访问数组元素,并使用wxLogMessage()函数输出每个元素的值。

当我们运行这个应用程序时,它将输出每个数组元素的值,即"apple"、“banana"和"orange”

遍历wxArrayString类

要遍历wxArrayString对象,可以使用wxArrayString类提供的GetCount()和Item()方法。GetCount()方法返回数组元素个数,Item()方法用于访问数组元素。

以下是一个示例代码,演示如何遍历wxArrayString对象

#include 
#include 

int main(int argc, char* argv[])
{
    wxArrayString strList;
    strList.Add("apple");
    strList.Add("banana");
    strList.Add("orange");
    
    for (size_t i = 0; i < strList.GetCount(); i++)
    {
        wxLogMessage("strList[%d]: %s", i, strList.Item(i));
    }
    
    return 0;
}

在这个示例代码中,我们首先包含了wx/arrstr.h头文件,并定义了一个wxArrayString对象strList。然后使用Add()方法向strList中添加多个字符串元素。接着使用for循环遍历strList对象,并使用Item()方法访问数组元素,并使用wxLogMessage()函数输出每个元素的值。

当我们运行这个应用程序时,它将输出每个数组元素的值,即"apple"、“banana"和"orange”。

你可能感兴趣的:(wxWidgets,QT,qt,wxwidgets,GUI,c++)