На четвертой неделе я начинаю изучать C ++; Я работал над CodeBlocks, но из-за моего интереса к созданию GUI я переключился на Qt Creator. Вернувшись в CodeBlocks, я создал функцию, которая позволит избежать всех повторений в приведенном ниже коде, изменяя только «TXT FILE». Тем не менее, с «специализированным» C ++ Qt Creator у меня возникают проблемы с пониманием того, как создать функцию, чтобы избежать всего этого повторения.
Есть идеи? (Я слишком далеко в этом проекте 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]);
}
}
Это общая проблема программирования, которая может улучшить код:
// 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
}
QT хорошо известен за Сигналы и Слоты. Каждая кнопка может быть подключена к слоту. Например в вашем случае. Вы можете подключить каждую радио-кнопку к слоту. чтобы сделать это, откройте форму графического интерфейса пользователя, щелкните правой кнопкой мыши переключатель и выберите «Перейти к слоту» и выберите слот, к которому вы хотите подключиться.
Это создаст пустую функцию в вашем файле .cpp.
Теперь напишите свой код для этой кнопки. И эта функция вызывается только тогда, когда эта конкретная кнопка нажата / нажата.
пример:
void ClassA::on_radioButton_clicked()
{
// write your code inside this function for , when this button is checked
}
Я надеюсь, что это поможет вам решить вашу проблему. Если у вас есть другой запрос, пожалуйста, предоставьте больше информации.