2012-11-27 30 views
1

我是第四周學習C++的初學者;我一直在研究CodeBlocks,但由於我對切換到Qt Creator的GUI感興趣,回到CodeBlocks中,我創建了一個函數,可以避免以下代碼中的所有重複操作,只更改「TXT文件」。但是,使用Qt Creator的「專業」C++,我很難理解如何創建一個函數來避免所有這些重複。創建一個高效的函數

任何想法? (我對這個Qt項目太過分了,無法回到CodeBlocks。)

「TXT FILE」根據用戶選擇哪個RadioButton而改變。

void MovierRec::on_searchButton_clicked() 
{ 
    int randomValue = qrand() % 100; 
    QList<QString> titles; 
    if(ui->modernButton->isChecked()) 
      { 
       QFile myfile(":/classics.txt"); 
       if (myfile.open(QIODevice::ReadOnly)) 
       { 
        QTextStream in(&myfile); 
        while (!in.atEnd()) 
        { 
         QString line = in.readLine(); 
         titles.append(line); 
        } 
        myfile.close(); 
        ui->textBrowser->setPlainText (titles[randomValue]); 
       } 
      } 
    else if(ui->romanceButton->isChecked()) 
      { 
       QFile myfile(":/romance.txt"); 
       if (myfile.open(QIODevice::ReadOnly)) 
       { 
        QTextStream in(&myfile); 
        while (!in.atEnd()) 
        { 
         QString line = in.readLine(); 
         titles.append(line); 
        } 
        myfile.close(); 
        ui->textBrowser->setPlainText (titles[randomValue]); 
       } 
      } 

    else if(ui->scifiButton->isChecked()) 
      { 
       QFile myfile(":/scifi.txt"); 
       if (myfile.open(QIODevice::ReadOnly)) 
       { 
        QTextStream in(&myfile); 
        while (!in.atEnd()) 
        { 
         QString line = in.readLine(); 
         //titles.append(line); 
        } 
        myfile.close(); 
        ui->textBrowser->setPlainText (titles[randomValue]); 
       } 
      } 
+0

QtCreator不做「專業C++」,只是簡單的C++。 Qt使用一些宏來生成額外的代碼,這不會使其成爲另一種語言或任何正常的C++代碼無法正常工作。 –

+0

可能與您的術語有關,但IDE選擇與創建函數有什麼關係?另外,Qt Creator只是帶有集成編輯器的普通IDE,您是指「專業C++」的含義?您是否將Qt(GUI框架)和Qt Creator(IDE,適用於所有C和C++編碼,而不僅僅是Qt)以及Qt Creator的「Designer」組件混合在一起? – hyde

+0

此外,挑選每個人說* QT *,這意味着(至少)蘋果QuickTime。 * Qt *是C++ GUI框架。 – hyde

回答

1

這是泛型編程的問題,可以以更好的方式重構代碼:

// I didn't dig into every line of the code. just provide the refactor idea here 
void getTitle(const QString& file_name, QList<QString>& titles;) 
{ 
    QFile myfile(file_name); 
    if (myfile.open(QIODevice::ReadOnly)) 
    { 
    QTextStream in(&myfile); 
    while (!in.atEnd()) 
    { 
     QString line = in.readLine(); 
     titles.append(line); 
    } 
    myfile.close(); 
} 
} 

void MovierRec::on_searchButton_clicked() 
{ 
    int randomValue = qrand() % 100; 
    QList<QString> titles; 
    if(ui->modernButton->isChecked()) 
    { 
     getTitle("classics.txt", titles);  
    } 
    else if(ui->romanceButton->isChecked()) 
    { 
     getTitle("romance.txt", titles);  
    } 
    else if(ui->scifiButton->isChecked()) 
    { 
     getTitle("scifi.txt", titles); 
    } 
    ui->textBrowser->setPlainText(titles[randomValue]); // move the dup action to the end 
} 
+0

感謝您的快速回復!我會研究它,看看我能否正確實施它!再次感謝! – user1855595

+0

您的代碼以光滑的方式工作,感謝您的快速課程!在將來的編碼中肯定會看到這一點。 – user1855595

0

QT很好的信號和槽聞名。每個按鈕都可以連接到一個插槽。例如你的情況。您可以將每個單選按鈕連接到一個插槽。爲了做到這一點,打開你的GUI窗體,右鍵單擊單選按鈕並選擇「轉到插槽」,然後選擇要連接的插槽。 這將在你的.cpp文件中創建一個空的函數。

現在編寫該按鈕的代碼。只有當按下/點擊特定按鈕時纔會調用此功能。

例如:

 void ClassA::on_radioButton_clicked() 
    { 
     // write your code inside this function for , when this button is checked 
     } 

我希望這將幫助您解決問題。如果您有其他疑問,請提供更多信息。