Russian Qt Forum

Qt => Вопросы новичков => Тема начата: k2rush от Май 25, 2012, 17:35



Название: "пробег" по всем флажкам
Отправлено: k2rush от Май 25, 2012, 17:35
Имеем такой виджет.
Сверху находится надпись1, чуть ниже прогресс бар, Ещё ниже лист с 5-ю значениями, которые checkable, и ниже всего этого безобразия кнопка "выполнить". При нажатии на кнопку, в надпись1 появляется значение из листа, которое было checked ну и прогресс бар ползёт, выполняется и переходит на следующую выделенную надпись и так до конца.(вроди нормально объяснил) Ну то есть как при любой установке.

Что я делаю.
Связываю кнопку с таймером, тамер со слотом который делает простую иттерацию, иттеративное значение с прогрусс баром.
Так вот, я пытаюсь использовать только один счётчик(не знаю верно или нет).
На иттеративную функцию вещаю условие, что если какое либо из из значений листа включенно, нужная надпись в надпись1, становится видимой, а по загрузке прогрусс бара так же становится невидимой(тут уже совсем не понятно, кодом дополню)

Проблем по моиму тут тьма, но самая явная, то что счётчик запускается в любом случае при нажатии кнопки, даже если выделенных элементов нет. ПРи попытке же выделить эти элементы сразу начинается загрузка прогресс бара, без нажатия кнопки. Пробывал вещать ограничения на счётчик, что он работает только при наличии включенных элементов, но н выходит((

Код
.h
Код:
public:
    Prep(QWidget *parent =0);
    QTimer *timer;

    QListWidgetItem *ListItem;
    QListWidgetItem *ListItem1;
    QListWidgetItem *ListItem2;
    QListWidgetItem *ListItem3;
    QListWidgetItem *ListItem4;
    int as;

private:
    int A;


public slots:
    void plus1();

    void itemClicked(QTreeWidgetItem *item, int column);

signals:
    void counterChanged(int);

.cpp
Код:
    setupUi(this);
    QTextCodec::setCodecForTr(QTextCodec::codecForName("System"));

    QLCDNumber *lcd = new QLCDNumber(2);
    lcd->show();

    timer = new QTimer(this);

    A=0;

    timer->setInterval(35);
    as=0;
    progressBar->setValue(as);

    label_15->hide();
    label_16->hide();
    label_17->hide();
    label_18->hide();






    connect(timer, SIGNAL(timeout()), this, SLOT(plus1()));

    connect(this, SIGNAL(counterChanged(int)),
            progressBar, SLOT(setValue(int)));

    connect(this, SIGNAL(counterChanged(int)),
            lcd, SLOT(display(int)));


    QTreeWidgetItem *TreeItem = new QTreeWidgetItem(treeWidget);
    TreeItem->setText(0, tr("Станция"));
    TreeItem->setIcon(0, QIcon(":/images/gray.bmp"));
    QTreeWidgetItem *TreeItem1 = new QTreeWidgetItem(TreeItem);
    TreeItem1->setText(0, tr("РП-330Б-РМ1(1)"));
    TreeItem1->setIcon(0, QIcon(":/images/gray.bmp"));
    QTreeWidgetItem *TreeItem2 = new QTreeWidgetItem(TreeItem);
    TreeItem2->setText(0, tr("РП-330Б-РМ1(2)"));
    TreeItem2->setIcon(0, QIcon(":/images/gray.bmp"));
    QTreeWidgetItem *TreeItem3 = new QTreeWidgetItem(TreeItem);
    TreeItem3->setText(0, tr("АП ДС1.2"));
    TreeItem3->setIcon(0, QIcon(":/images/gray.bmp"));
    QTreeWidgetItem *TreeItem4 = new QTreeWidgetItem(TreeItem);
    TreeItem4->setText(0, tr("УС14.1"));
    TreeItem4->setIcon(0, QIcon(":/images/gray.bmp"));
    QTreeWidgetItem *TreeItem5 = new QTreeWidgetItem(TreeItem);
    TreeItem5->setText(0, tr("КС-100"));
    TreeItem5->setIcon(0, QIcon(":/images/gray.bmp"));
    QTreeWidgetItem *TreeItem6 = new QTreeWidgetItem(TreeItem);
    TreeItem6->setText(0, tr("AR5000"));
    TreeItem6->setIcon(0, QIcon(":/images/gray.bmp"));

    connect(treeWidget, SIGNAL(itemClicked(QTreeWidgetItem*, int)),
            tab, SLOT(showNormal()));

    ListItem = new QListWidgetItem(listWidget_5);
    ListItem->setText(tr("Загрузить"));
    ListItem->setCheckState(Qt::Unchecked);

    ListItem1 = new QListWidgetItem(listWidget_5);
    ListItem1->setText(tr("Калибровать"));
    ListItem1->setCheckState(Qt::Unchecked);

    ListItem2 = new QListWidgetItem(listWidget_5);
    ListItem2->setText(tr("Загрузить блок БВ-УПСБ"));
    ListItem2->setCheckState(Qt::Unchecked);

    ListItem3 = new QListWidgetItem(listWidget_5);
    ListItem3->setText(tr("Провести тест"));
    ListItem3->setCheckState(Qt::Unchecked);

    ListItem4 = new QListWidgetItem(listWidget_5);
    ListItem4->setText(tr("Включить в конфиг"));
    ListItem4->setCheckState(Qt::Unchecked);

    if((ListItem->checkState()==Qt::Checked))// || (ListItem1->checkState()==Qt::Checked) || (ListItem2->checkState()==Qt::Checked) || (ListItem3->checkState()==Qt::Checked) || (ListItem4->checkState()==Qt::Checked))
    {
       // connect(pushButton, SIGNAL(clicked()),
         //       timer, SLOT(start()));


    }







}



void Prep::plus1()
{

    if(as==99)
    {


        if (A==1)
        {
         as=0;
         emit counterChanged(as);

         label_16->hide();
         ListItem->setCheckState(Qt::Unchecked);

        }
        if (A==2)
        {
         as=0;
         emit counterChanged(as);
         //timer->stop();
         label_15->hide();

        }




    }
    else{
        if(ListItem->checkState()==Qt::Checked)

        {
        label_15->show();
         emit counterChanged(++as);
        A=1;
        }
        if(ListItem->checkState()==Qt::Checked)

        {
            label_16->show();
            emit counterChanged(++as);
           A=2;
        }
        }
}
   


Название: Re: "пробег" по всем флажкам
Отправлено: k2rush от Май 26, 2012, 12:03
(http://s019.radikal.ru/i643/1205/7e/0562a2a30a82.jpg)
(http://s019.radikal.ru/i615/1205/63/38557f993235.jpg)


Название: Re: "пробег" по всем флажкам
Отправлено: Kurles от Май 26, 2012, 14:16
При чем тут "алгоритмы" и где ты тут увидел кучу проблем?
mainwindow.h
Код
C++ (Qt)
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
 
#include <QMainWindow>
 
class QListWidgetItem;
class Qtimer;
 
namespace Ui {
class MainWindow;
}
 
class MainWindow : public QMainWindow
{
   Q_OBJECT
 
public:
   explicit MainWindow(QWidget *parent = 0);
   ~MainWindow();
 
signals:
   void progressBarEndReached();
 
private slots:
   void on_pushButton_clicked();
   void onTimer();
   void onProgressBarEndReached();
 
 
private:
   Ui::MainWindow *ui;
   QTimer* timer;
   int current;
   bool chkBoxIsChecked;
};
 
#endif // MAINWINDOW_H
 

mainwindow.cpp
Код
C++ (Qt)
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QTimer>
#include <QMessageBox>
MainWindow::MainWindow(QWidget *parent) :
   QMainWindow(parent),
   ui(new Ui::MainWindow)
{
   ui->setupUi(this);
   ui->label->setText(QString());
   ui->progressBar->setEnabled(true);
   timer = new QTimer(this);
   timer->setInterval(20);
   connect(timer, SIGNAL(timeout()),this, SLOT(onTimer()));
   connect(this, SIGNAL(progressBarEndReached()), this, SLOT(onProgressBarEndReached()));
   QStringList names, topView;
   names << trUtf8("Загрузить")
         << trUtf8("Калибровать")
         << trUtf8("Загрузить блок БВ-УПСБ")
         << trUtf8("Провести тест")
         << trUtf8("Включить в конфиг");
 
   topView << trUtf8("Загрузка")
           << trUtf8("Калибровка")
           << trUtf8("Загрузка блока БВ-УПСБ")
           << trUtf8("Проведение теста")
           << trUtf8("Включение в конфиг");
   for (int i = 0; i < names.count(); ++i)
   {
       QListWidgetItem *item = new QListWidgetItem(names.at(i));
       item->setCheckState(Qt::Unchecked);
       item->setData(Qt::UserRole, topView.at(i));
       ui->listWidget->addItem(item);
   }
}
 
MainWindow::~MainWindow()
{
   delete ui;
}
 
void MainWindow::on_pushButton_clicked()
{
   current = 0;
   ui->pushButton->setEnabled(false);
   chkBoxIsChecked = false;
   emit progressBarEndReached();
 
}
 
void MainWindow::onTimer()
{
   int value = ui->progressBar->value();
   if (value >= ui->progressBar->maximum())
   {
       emit progressBarEndReached();
       return;
   }
   ui->progressBar->setValue(value + 1);
}
 
void MainWindow::onProgressBarEndReached()
{
   if (timer->isActive())
       timer->stop();
   while (true){
       if (current >= ui->listWidget->count())
       {
           chkBoxIsChecked ? QMessageBox::information(this, trUtf8("Внимание!"), trUtf8("Работа выполнена")) :
                             QMessageBox::information(this, trUtf8("Внимание!"), trUtf8("Не отмечено ни одного условия"));
           timer->stop();
           ui->pushButton->setEnabled(true);
           ui->label->setText(QString());
           ui->progressBar->setValue(0);
           return;
       }
       if (ui->listWidget->item(current)->checkState() == Qt::Checked)
       {
           chkBoxIsChecked = true;
           ui->label->setText(ui->listWidget->item(current)->data(Qt::UserRole).toString());
           ui->progressBar->setValue(0);
           ++current;
           timer->start();
           return;
       }
       ++current;
   }
}
 


Название: Re: "пробег" по всем флажкам
Отправлено: k2rush от Май 26, 2012, 20:02
Спасибо за грамотный ответ, но к этому времени я уже кое как сам сделал.
Оцените.

Правда в первый раз пробег прогресс бара идёт в 4 раза быстрей чем в последнем
Код
C++ (Qt)
void Prep::plus1()
{
 
 
 
   if (ListItem->checkState()==Qt::Checked)
   {
   if (as>95)
   {
       label_15->hide();
       as=0;
       emit counterChanged(as);
       ListItem->setCheckState(Qt::Unchecked);
 
   }
   else
   {
       label_15->show();
 
       emit counterChanged(++as);
 
   }
   }
   label2();
 
 
}
void Prep::label2()
{
   if (ListItem1->checkState()==Qt::Checked)
   {
   if (as>96)
   {
       label_16->hide();
       as=0;
       emit counterChanged(as);
       ListItem1->setCheckState(Qt::Unchecked);
 
   }
   else
   {
       if(((ListItem->checkState()==Qt::Unchecked)))
       label_16->show();
 
 
       emit counterChanged(++as);
 
   }
   }
   label3();
 
}
 
void Prep::label3()
{
   if (ListItem2->checkState()==Qt::Checked)
   {
   if (as>97)
   {
       label_17->hide();
       as=0;
       emit counterChanged(as);
       ListItem2->setCheckState(Qt::Unchecked);
 
   }
   else
   {
        if(((ListItem->checkState()==Qt::Unchecked)) && (ListItem1->checkState()==Qt::Unchecked))
       label_17->show();
 
       emit counterChanged(++as);
 
   }
}
   label4();
 
}
 
void Prep::label4()
{
   if (ListItem3->checkState()==Qt::Checked)
   {
   if (as>98)
   {
       label_18->hide();
       as=0;
       emit counterChanged(as);
       ListItem3->setCheckState(Qt::Unchecked);
 
   }
   else
   {
       if(((ListItem->checkState()==Qt::Unchecked)) && (ListItem1->checkState()==Qt::Unchecked) && (ListItem2->checkState()==Qt::Unchecked))
       label_18->show();
 
       emit counterChanged(++as);
 
   }
   }
   if(((ListItem->checkState()==Qt::Unchecked)) && (ListItem1->checkState()==Qt::Unchecked) && (ListItem2->checkState()==Qt::Unchecked) && (ListItem3->checkState()==Qt::Unchecked))
   timer->stop();
}