Russian Qt Forum

Qt => Вопросы новичков => Тема начата: jonyroww от Май 28, 2014, 18:44



Название: Перетасовка объектов на форме
Отправлено: jonyroww от Май 28, 2014, 18:44
Здравствуйте!

Пишу систему тестирования в Qt. Нужно, чтобы чекбоксы при запуске меняли положение. Как это сделать?
#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent)

{
    setupUi(this);
    checkBox->hide();
    checkBox_2->hide();
    checkBox_3->hide();
    plainTextEdit->hide();
    label->hide();
    label_2->hide();
    pushButton_2->hide();

    ans = "";
    cnt = 0;
    f.open("in.txt");

    right = 0;

}
void MainWindow::on_pushButton_clicked()
{
    pushButton->hide();
    checkBox->show();
    checkBox_2->show();
    checkBox_3->show();
    plainTextEdit->show();


    std::getline(f, ans);
    plainTextEdit->setPlainText(QString::fromLocal8Bit(ans.c_str()));
    std::getline(f, ans);
    checkBox->setText(QString::fromLocal8Bit(ans.c_str()));
    std::getline(f, ans);
    checkBox_2->setText(QString::fromLocal8Bit(ans.c_str()));
    std::getline(f, ans);
    checkBox_3->setText(QString::fromLocal8Bit(ans.c_str()));

    std::getline(f, ans);

}

void MainWindow::on_checkBox_clicked()
{
    cnt ++;

    if(cnt > 9)
    {
        label_2->setText(QString::number(right));
        label->show();
        label_2->show();
        pushButton_2->show();

        checkBox->hide();
        checkBox_2->hide();
        checkBox_3->hide();
        plainTextEdit->hide();




        return;
    }

    if(QString::fromLocal8Bit(ans.c_str()) == checkBox->text())
        right ++;


    std::getline(f, ans);
    plainTextEdit->setPlainText(QString::fromLocal8Bit(ans.c_str()));
    std::getline(f, ans);
    checkBox->setText(QString::fromLocal8Bit(ans.c_str()));
    std::getline(f, ans);
    checkBox_2->setText(QString::fromLocal8Bit(ans.c_str()));
    std::getline(f, ans);
    checkBox_3->setText(QString::fromLocal8Bit(ans.c_str()));

    std::getline(f, ans);


    checkBox->setChecked(false);
}
void MainWindow::on_checkBox_2_clicked()
{
    cnt ++;

    if(cnt > 9)
    {
        label_2->setText(QString::number(right));
        label->show();
        label_2->show();
        pushButton_2->show();

        checkBox->hide();
        checkBox_2->hide();
        checkBox_3->hide();
        plainTextEdit->hide();
        return;
    }

    if(QString::fromLocal8Bit(ans.c_str()) == checkBox_2->text())
        right ++;


    std::getline(f, ans);
    plainTextEdit->setPlainText(QString::fromLocal8Bit(ans.c_str()));
    std::getline(f, ans);
    checkBox->setText(QString::fromLocal8Bit(ans.c_str()));
    std::getline(f, ans);
    checkBox_2->setText(QString::fromLocal8Bit(ans.c_str()));
    std::getline(f, ans);
    checkBox_3->setText(QString::fromLocal8Bit(ans.c_str()));

    std::getline(f, ans);


    checkBox_2->setChecked(false);

}
void MainWindow::on_checkBox_3_clicked()
{
    cnt ++;

    if(cnt > 9)
    {
        label_2->setText(QString::number(right));
        label->show();
        label_2->show();
        pushButton_2->show();

        checkBox->hide();
        checkBox_2->hide();
        checkBox_3->hide();
        plainTextEdit->hide();
        return;
    }

    if(QString::fromLocal8Bit(ans.c_str()) == checkBox_3->text())
        right ++;


    std::getline(f, ans);
    plainTextEdit->setPlainText(QString::fromLocal8Bit(ans.c_str()));
    std::getline(f, ans);
    checkBox->setText(QString::fromLocal8Bit(ans.c_str()));
    std::getline(f, ans);
    checkBox_2->setText(QString::fromLocal8Bit(ans.c_str()));
    std::getline(f, ans);
    checkBox_3->setText(QString::fromLocal8Bit(ans.c_str()));

    std::getline(f, ans);


    checkBox_3->setChecked(false);




}

void MainWindow::on_pushButton_2_clicked()
{
 close();
}


Название: Re: Перетасовка объектов на форме
Отправлено: kambala от Май 28, 2014, 21:40
какое положение? через setChecked() что ли?


Название: Re: Перетасовка объектов на форме
Отправлено: jonyroww от Май 28, 2014, 22:16
какое положение? через setChecked() что ли?
Положение на форме. В чекбоксы выводятся варианты ответов из текстового файла, то есть они должны каждый раз перемешиваться.


Название: Re: Перетасовка объектов на форме
Отправлено: Kurles от Май 28, 2014, 23:46
Читай из файла значения, но не сразу их выводи в чекбоксы, а в std::list например, затем значения этого контейнера перемешай с помощью того же std::shuffle или своей реализацией алгоритма, и уже из перемешенного списка задавай описания чекбоксам. Вроде довольно прямолинейный алгоритм :)


Название: Re: Перетасовка объектов на форме
Отправлено: jonyroww от Май 29, 2014, 08:09
Читай из файла значения, но не сразу их выводи в чекбоксы, а в std::list например, затем значения этого контейнера перемешай с помощью того же std::shuffle или своей реализацией алгоритма, и уже из перемешенного списка задавай описания чекбоксам. Вроде довольно прямолинейный алгоритм :)

Если не трудно, можете привести пример из моего кода?))


Название: Re: Перетасовка объектов на форме
Отправлено: Kurles от Май 29, 2014, 10:39
Читай из файла значения, но не сразу их выводи в чекбоксы, а в std::list например, затем значения этого контейнера перемешай с помощью того же std::shuffle или своей реализацией алгоритма, и уже из перемешенного списка задавай описания чекбоксам. Вроде довольно прямолинейный алгоритм :)

Если не трудно, можете привести пример из моего кода?))
Код ваш ужасен, архитектура очень плохая. Куча повторяющегося кода, жёстко забитое кол-во как вариантов ответа, так и кол-во вопросов. Легче полностью переделать, чем в вашем коде что-то править )