1

私は C++ を学習して 4 週間目の初心者です。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]);
                }
           }
4

2 に答える 2

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
 }
于 2012-11-27T07:01:02.653 に答える
0

QTはシグナルとスロットでよく知られています。各ボタンはスロットに接続できます。たとえば、あなたの場合。各ラジオボタンをスロットに接続できます。これを行うには、GUIフォームを開き、ラジオボタンを右クリックして[スロットに移動]を選択し、接続するスロットを選択します。これにより、ur.cppファイルに空の関数が作成されます。

次に、そのボタンのコードを記述します。そして、この関数は、その特定のボタンが押された/クリックされたときにのみ呼び出されます。

例:

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

これが問題の解決に役立つことを願っています。他に質問がある場合は、詳細をお知らせください。

于 2012-11-27T07:05:04.433 に答える