LinuxForum.Fans
Тема

Qt/QProgressBar

Автор: Leviafan 9 сообщений 7248 просмотров
#1302
text

FormBar::FormBar(QWidget *parent)
        :QProgressBar(parent)
{

setupUi(this); progressBar->setValue(testbar());

}

int FormBar::testbar() { for(int i = 2; i <100; i++) { return i; } }

По идее этот цикл должен изменять шкалу QProgressBar от 2 до 100, но у меня выводится тока 2 и шкала дальше не меняется. Помогите мне встать на путь истинный
Исходник проги прикрепил

#1312

Все правильно. Прикиньте: запускаете Вы функцию testbar. Стартует цикл. Переменной i присваивается значение 2. И сразу же происходит выход и из функции, и из цикла по return. То есть, сколько бы вы раз эту функцию не вызывали, результат возврата всегда будет 2

Такие вещи делаются методом signal/slot. Где-то как-то вот так:

text
progressbar::progressbar(QWidget *parent)
    : QWidget(parent)
{
    win = new QWidget(this);
    win->setWindowTitle(("LCD Number"),this);
    layout = new QVBoxLayout(this);
    bar = new QProgressBar(this);
    spin = new QSpinBox(this);
    spin->setMaximum(99);
    spin->setMinimum(0);
    bar->resize(200,25);
    bar->setOrientation(Qt::Horizontal);//Orientation can also be vertical
    bar->setRange(0,99);
    connect(spin , SIGNAL(valueChanged(int)), bar, SLOT(setValue(int)));
    layout->addWidget(spin,Qt::AlignCenter);
 
    layout->addWidget(bar,Qt::AlignCenter);
    win->setLayout(layout);
    win->showMaximized();
}
#1556

А можно на примере моего примера? И как мне передать тогда результат моей функции?

#1760
Leviafan написал:
А можно на примере моего примера? И как мне передать тогда результат моей функции?

На вашем, в том виде, какой он есть, не получится к сожалению. Могу его вам переделать по уму, но только ближе к вечеру

#1775

Буду ждать

#314884

вот и прошло три года, мне долго еще ждать? o_O

#314885

вот и снова понадобилась ваша помощь

Показать
main.cpp
text
#include "dialog.h"
#include <QApplication>

int main(int argc, char *argv[]) { QApplication a(argc, argv); Dialog w; w.show(); return a.exec(); }

dialog.h

text
#ifndef DIALOG_H
#define DIALOG_H

#include <QDialog> #include <QLabel> #include <QProgressBar>

namespace Ui { class Dialog; }

class Dialog : public QDialog { Q_OBJECT public: explicit Dialog(QWidget *parent = 0); ~Dialog();

private: QPushButton *pushButton;

private: QLabel *label;

public: QProgressBar *progressBar; private: Ui::Dialog *ui;

private slots: void handleButton();

public slots: void onWrite(qint64 val); };

#endif // DIALOG_H

dialog.cpp

text
#include "dialog.h"
#include "ui_dialog.h"
#include <QFile>

Dialog::Dialog(QWidget *parent) : QDialog(parent), ui(new Ui::Dialog) {

ui->setupUi(this);

connect(ui->pushButton, SIGNAL(clicked()), this, SLOT(handleButton()));

}

void Dialog::handleButton() {

ui->label->setText("Start");

QFile from("/home/leviafan/qBT_dir/XenogearsFullrus.rar"); QFile to("/home/leviafan/123123/test.rar"); ui->progressBar->setMaximum(from.size());

from.copy(to.fileName());

connect(&to, SIGNAL(bytesWritten(qint64)), this, SLOT(onWrite(qint64)));

} void Dialog::onWrite(qint64 val) { ui->progressBar->setValue(val); qDebug("%d", &val);//вот тут где то я запутался

} Dialog::~Dialog() { delete ui; }

dialog.ui

text
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
 <class>Dialog</class>
 <widget class="QDialog" name="Dialog">
  <property name="geometry">
   <rect>
    <x>0</x>
    <y>0</y>
    <width>400</width>
    <height>300</height>
   </rect>
  </property>
  <property name="windowTitle">
   <string>Dialog</string>
  </property>
  <widget class="QPushButton" name="pushButton">
   <property name="geometry">
    <rect>
     <x>140</x>
     <y>40</y>
     <width>100</width>
     <height>24</height>
    </rect>
   </property>
   <property name="text">
    <string>PushButton</string>
   </property>
  </widget>
  <widget class="QLabel" name="label">
   <property name="geometry">
    <rect>
     <x>160</x>
     <y>100</y>
     <width>59</width>
     <height>15</height>
    </rect>
   </property>
   <property name="text">
    <string>TextLabel</string>
   </property>
  </widget>
  <widget class="QProgressBar" name="progressBar">
   <property name="geometry">
    <rect>
     <x>27</x>
     <y>150</y>
     <width>351</width>
     <height>23</height>
    </rect>
   </property>
   <property name="value">
    <number>0</number>
   </property>
  </widget>
 </widget>
 <layoutdefault spacing="6" margin="11"/>
 <resources/>
 <connections/>
</ui>

ошибок никаких не выдает, но прогрессбар не работает, файл копируется
в общем помогите не помереть со скуки на работе

#314992

1. Функция установки максимума принимает int а не qint64

"Leviafan⇓" написал:
ui->progressBar->setMaximum(from.size());

2. Вероятней всего коннект не отработает, по той причине что вы создаете обьект QFile и передаете ему имя файла. Для того чтобы связать обьект с файлом необходимо выполнить

text
 to.Open(QIODEVICES::WRITEONLY) 

и после выполнения

text
 to.write (char *, int nByt)

он испустит сигнал bytesWritten(qint64).

"Leviafan⇓" написал:
QFile from("/home/leviafan/qBT_dir/XenogearsFullrus.rar");
QFile to("/home/leviafan/123123/test.rar");
ui->progressBar->setMaximum(from.size());

from.copy(to.fileName());

connect(&to, SIGNAL(bytesWritten(qint64)), this, SLOT(onWrite(qint64)));

P.S. на счет 2 го пункта я не уверен, нужно проверять.

#315000
"marikk⇓" написал:
2.  Вероятней всего коннект не отработает, по той причине что вы создаете обьект QFile и передаете ему имя файла. Для того чтобы связать обьект с файлом необходимо выполнить

а ещё это не работает потому что QFile::copy() возвращается только после полного копирования файла...
а ещё потому что QFile::copy() не испускает никаких сигналов...
а ещё почему я пока не придумал...

Войдите или зарегистрируйтесь, чтобы ответить.