创建高效的功能

时间:2012-11-27 06:47:16

标签: c++ qt function qt-creator repeat

我是第四周学习C ++的初学者;我一直在研究CodeBlocks,但由于我对制作GUI的兴趣,我转而使用Qt Creator。回到CodeBlocks我创建了一个函数,可以避免下面代码中的所有重复,只更改“TXT FILE”。但是,使用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]);
                }
           }

2 个答案:

答案 0 :(得分: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
 }

答案 1 :(得分:0)

QT以信号和插槽而闻名。每个按钮都可以连接到一个插槽。例如你的情况。您可以将每个单选按钮连接到插槽。为此,请打开您的GUI表单,右键单击单选按钮并选择“转到插槽”,然后选择要连接的插槽。 这将在你的.cpp文件中创建一个空函数。

现在编写该按钮的代码。只有在按下/单击该特定按钮时才会调用此函数。

示例:

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

我希望这可以帮助您解决问题。如果您有其他疑问,请提供更多信息。