创建一个高效的函数

Posted

技术标签:

【中文标题】创建一个高效的函数【英文标题】:Creating an Efficient Function 【发布时间】:2012-11-27 06:47:15 【问题描述】:

我是第四周学习 C++ 的初学者;我一直在研究 CodeBlocks,但由于我对制作 GUI 感兴趣,我转而使用 Qt Creator。回到 CodeBlocks,我创建了一个函数,可以避免下面代码中的所有重复,只更改“TXT 文件”。但是,使用 Qt Creator 的“专用”C++,我很难理解如何创建一个函数来避免所有这些重复。

有什么想法吗? (我对这个 Qt 项目太深入了,无法回到 CodeBlocks。)

“TXT 文件”会根据用户选择的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]);
                
           

【问题讨论】:

QtCreator 不做“专门的 C++”,只是做普通的 C++。 Qt 使用一些宏来生成额外的代码,这不会使它成为另一种语言或任何正常的 C++ 代码不起作用。 可能与您的术语有关,但 IDE 选择与创建函数有什么关系?另外,Qt Creator 只是带有集成编辑器的普通 IDE,“专业 C++”是什么意思?您是在混合 Qt(GUI 框架)和 Qt Creator(IDE,适用于所有 C 和 C++ 编码,而不仅仅是 Qt),以及 Qt Creator 的“Designer”组件吗? 另外,对于每个说 QT 的人来说,这意味着(至少)Apple QuickTime。 Qt 是 C++ GUI 框架。 我猜发生的事情是我对在所有事情之前必须使用这个“Q”的方式(如在 QList、QVector、QFile 等)与使用方式相比有点不知所措我在 CodeBlocks 工作(仅使用 TextStream、Vector 等)。由于缺乏经验,可能无法正确解释自己,但关键是我在“措辞”函数时遇到了麻烦,而不是函数的逻辑。 【参考方案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
 

【讨论】:

感谢您的快速回复!我会研究它,看看我是否可以正确实施它!再次感谢! 您的代码运行起来像黄油一样流畅,感谢您的快速课程!绝对会在未来的编码中关注这一点。【参考方案2】:

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

现在为该按钮编写代码。并且仅当按下/单击该特定按钮时才调用此函数。

示例:

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

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

【讨论】:

以上是关于创建一个高效的函数的主要内容,如果未能解决你的问题,请参考以下文章

高效Java:clone()方法分析

创建批处理并将函数应用于python列表的内存高效且最快的方法

Python 高效包装器

高效创建日期

Effective Java高效编程

更高效的decodeAudioData()?