簡體   English   中英

設置QLineEdit時std :: out_of_range

[英]std::out_of_range while setting a QLineEdit

在我的C ++應用程序中,我必須選擇一個帶有QFileDialog類的文件。 然后,我驗證我的文件名是否正確(它必須以“VG”開頭)。

我的文件具有以下結構: VGx-xx-xxxx-xxx-xxx.pigs

之后,我在關聯QLineEdit中設置它。 但每次我選擇一個好的文件,它都會崩潰,我不明白為什么。

這是我不同的功能:

打開QFILE對話窗口

/** OPEN FILE DIALOG WINDOW  **/
void VGCCC::selectPIGSFile()
{
    QString pigsFile = QFileDialog::getOpenFileName
    (
        this,
        tr("Select PIGS file"),
        "./../VGCColorConfigurator/Inputs",
        tr("Document files (*.pigs *.igs)"),
        0,
        QFileDialog::DontUseNativeDialog
    );

    pigsPath = pigsFile;
    if(verifyPIGSFileValidity(pigsPath.toStdString()))
    {
        m_filePathLine->setText("");
        m_filePathLine->setText(pigsPath);
        m_testTextEdit->insertPlainText("File selected : "+pigsPath+"\n");
    }
    else
    {
        m_filePathLine->setText("Please select a valid PIGS (Format VGx-xx-xxxx-xxx-xxx.pigs)");
        m_testTextEdit->insertPlainText("Uncorrect PIGS file.\n");
    }
}

驗證文件名稱

/** VERIFY SELECTED PIG FILE **/
bool VGCCC::verifyPIGSFileValidity(std::string pigsPath)
{
    splitPIGSName(pigsPath);
    std::string verification = pigsNameTable[0].erase(2,2);
    std::string headerName = "VG";

    if(!verification.compare(headerName))
    {
        m_testTextEdit->insertPlainText("PIGS name is correct");
        return true;
    }
    else
        return false;
}

分裂方法

/** SPLIT PIGS NAME INTO TABLE **/
std::string* VGCCC::splitPIGSName(std::string pigsPath)
{
    std::string pigsPathToSplit = pigsPath;
    std::string delimiter = "-";
    size_t position = 0;
    int i=0;
    std::string token;

    while ((position = pigsPathToSplit.find(delimiter)) != std::string::npos)
    {
        token = pigsPathToSplit.substr(0, position);
        std::cout << token << std::endl;
        pigsNameTable[i] = token;
        i++;
        pigsPathToSplit.erase(0, position + delimiter.length());
    }
    pigsNameTable[4] = pigsPathToSplit.c_str();
    std::cout << pigsPathToSplit << std::endl;
}
bool VGCCC::verifyPIGSFileValidity(std::string pigsPath)
{
    splitPIGSName(pigsPath);
    std::string verification = pigsNameTable[0].erase(2,2);
    std::string headerName = "VG";

    if(!verification.compare(headerName))
    {
        m_testTextEdit->insertPlainText("PIGS name is correct");
        return true;
    }
    else
        return false;
}

不安全是因為:

1-您不檢查pigsNameTable是否在索引pigsNameTable有元素(如果是vector ?)或鍵(如果是map ?) 0

2-您不檢查pigsNameTable[0]是否包含2個以上的元素。 請參閱刪除文檔

pos:要刪除的第一個字符的位置。 如果這大於字符串長度,則拋出out_of_range。

你可以這樣做:

bool VGCCC::verifyPIGSFileValidity(std::string pigsPath)
{
    splitPIGSName(pigsPath);

    if ( /* test is pigsNameTable[0] exists depending on pigsNameTable's type */ )
    {
        return pigsNameTable[0].find( "VG" ) == 0; // return true if pigsNameTable[0] starts with "VG"
    }
    else
    {
        return false;
    }
}

如果pigsNameTable是一個vector則測試可以是!pigsNameTable.empty() ,如果它是一個mappigsNameTable.find(0) != pigsNameTable.end() ....

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM