Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: pish_r от Августа 09, 2005, 00:26



Название: Диалог ожидания
Отправлено: pish_r от Августа 09, 2005, 00:26
Нужна альтернатива QProgressDialog, но для случаев. когда количество итераций неизвестно(однако достаточно велико), но нужно давать юзеру понять что приложение не висит. Может что то типа виндузного диалога с вращающимся увеличительным стеклом вокруг монитора. Чтоб юзать можно было где то так:
Код:

QWaitDialog dlg("wait,please");//Сфантазированный класс
while(действите.isEnd()){
if(dlg.isCanceled()){
breack;
}
//Че-то делаем
}

Если есть у кого подобный класс поделитесь, а то я третий год без отпуска ,а на улице лето, и мозгой вертеть совсем тяжко


Название: Диалог ожидания
Отправлено: Hellenna от Августа 09, 2005, 09:37
Пользуйся наздоровье. В форме полосочка бегает туда-сюда.
ProcessForm.ui.h
Код:
#include <qcanvas.h>
#include <qtimer.h>
#include <qrect.h>

//QCanvas *canvas;
QTimer *timer;
int frm_x;
int frm_y;
//QRect *rect;

void ProgressForm::init()
{
     int pw_mid=parentWidget()->width()/2;
      int ph_mid=parentWidget()->height()/2;
      int w_mid=width()/2;
      int h_mid=height()/2;
      setGeometry ( pw_mid-w_mid, ph_mid-h_mid, width(), height() );
      QRect rect1 (frmProcess->frameRect());
     frm_x=rect1.x();
     frm_y=rect1.y();
     timer = new QTimer( this);
     connect( timer, SIGNAL(timeout()), SLOT(paintProcess()) );
     //timer->start( 100, false );
     setFixedSize(size());
     btnCancel->hide();
     textLabel1->hide();
  }

void ProgressForm::paintProcess()
{
    QRect canvas_rect (frmCanvas->frameRect());
    int canvas_right=canvas_rect.right();
    if(frm_x>=canvas_right)
    {
frm_x=canvas_rect.x();
    }
    else frm_x=frm_x+5;
    frmProcess->move(frm_x, frm_y);
    frmProcess->repaint();
}



void ProgressForm::btnCancel_clicked()
{
    emit killProcess();
    //reject();
}


void ProgressForm::setText( QString text )
{
    lblProcess->setText(text);
}


void ProgressForm::hideForm()
{
    timer->stop();
    hide();
}

void ProgressForm::showForm()
{
    timer->start( 100, false );
    show();
}

ProcessForm.ui
Код:

<!DOCTYPE UI><UI version="3.1" stdsetdef="1">
<class>ProgressForm</class>
<widget class="QDialog">
    <property name="name">
        <cstring>ProgressForm</cstring>
    </property>
    <property name="geometry">
        <rect>
            <x>0</x>
            <y>0</y>
            <width>468</width>
            <height>135</height>
        </rect>
    </property>
    <property name="backgroundOrigin">
        <enum>WidgetOrigin</enum>
    </property>
    <property name="caption">
        <string>Progress...</string>
    </property>
    <property name="modal" stdset="0">
        <bool>true</bool>
    </property>
    <grid>
        <property name="name">
            <cstring>unnamed</cstring>
        </property>
        <widget class="QLayoutWidget" row="0" column="0">
            <property name="name">
                <cstring>layout4</cstring>
            </property>
            <vbox>
                <property name="name">
                    <cstring>unnamed</cstring>
                </property>
                <widget class="QLabel">
                    <property name="name">
                        <cstring>lblProcess</cstring>
                    </property>
                    <property name="text">
                        <string>&lt;type of the process&gt;</string>
                    </property>
                    <property name="alignment">
                        <set>WordBreak|AlignVCenter</set>
                    </property>
                </widget>
                <widget class="QFrame">
                    <property name="name">
                        <cstring>frmCanvas</cstring>
                    </property>
                    <property name="sizePolicy">
                        <sizepolicy>
                            <hsizetype>1</hsizetype>
                            <vsizetype>0</vsizetype>
                            <horstretch>0</horstretch>
                            <verstretch>0</verstretch>
                        </sizepolicy>
                    </property>
                    <property name="minimumSize">
                        <size>
                            <width>100</width>
                            <height>20</height>
                        </size>
                    </property>
                    <property name="paletteForegroundColor">
                        <color>
                            <red>81</red>
                            <green>89</green>
                            <blue>125</blue>
                        </color>
                    </property>
                    <property name="frameShape">
                        <enum>GroupBoxPanel</enum>
                    </property>
                    <property name="frameShadow">
                        <enum>Plain</enum>
                    </property>
                    <property name="lineWidth">
                        <number>1</number>
                    </property>
                    <widget class="QFrame">
                        <property name="name">
                            <cstring>frmProcess</cstring>
                        </property>
                        <property name="geometry">
                            <rect>
                                <x>0</x>
                                <y>0</y>
                                <width>60</width>
                                <height>20</height>
                            </rect>
                        </property>
                        <property name="sizePolicy">
                            <sizepolicy>
                                <hsizetype>0</hsizetype>
                                <vsizetype>0</vsizetype>
                                <horstretch>0</horstretch>
                                <verstretch>0</verstretch>
                            </sizepolicy>
                        </property>
                        <property name="minimumSize">
                            <size>
                                <width>30</width>
                                <height>20</height>
                            </size>
                        </property>
                        <property name="paletteForegroundColor">
                            <color>
                                <red>0</red>
                                <green>0</green>
                                <blue>0</blue>
                            </color>
                        </property>
                        <property name="paletteBackgroundColor">
                            <color>
                                <red>165</red>
                                <green>180</green>
                                <blue>255</blue>
                            </color>
                        </property>
                        <property name="palette">
                            <palette>
                                <active>
                                    <color>
                                        <red>0</red>
                                        <green>0</green>
                                        <blue>0</blue>
                                    </color>
                                    <color>
                                        <red>129</red>
                                        <green>140</green>
                                        <blue>199</blue>
                                    </color>
                                    <color>
                                        <red>208</red>
                                        <green>215</green>
                                        <blue>255</blue>
                                    </color>
                                    <color>
                                        <red>168</red>
                                        <green>177</green>
                                        <blue>227</blue>
                                    </color>
                                    <color>
                                        <red>64</red>
                                        <green>69</green>
                                        <blue>99</blue>
                                    </color>
                                    <color>
                                        <red>85</red>
                                        <green>92</green>
                                        <blue>132</blue>
                                    </color>
                                    <color>
                                        <red>0</red>
                                        <green>0</green>
                                        <blue>0</blue>
                                    </color>
                                    <color>
                                        <red>255</red>
                                        <green>255</green>
                                        <blue>255</blue>
                                    </color>
                                    <color>
                                        <red>0</red>
                                        <green>0</green>
                                        <blue>0</blue>
                                    </color>
                                    <color>
                                        <red>255</red>
                                        <green>255</green>
                                        <blue>255</blue>
                                    </color>
                                    <color>
                                        <red>165</red>
                                        <green>180</green>
                                        <blue>255</blue>
                                    </color>
                                    <color>
                                        <red>0</red>
                                        <green>0</green>
                                        <blue>0</blue>
                                    </color>
                                    <color>
                                        <red>0</red>
                                        <green>0</green>
                                        <blue>128</blue>
                                    </color>
                                    <color>
                                        <red>255</red>
                                        <green>255</green>
                                        <blue>255</blue>
                                    </color>
                                    <color>
                                        <red>0</red>
                                        <green>0</green>
                                        <blue>0</blue>
                                    </color>
                                    <color>
                                        <red>0</red>
                                        <green>0</green>
                                        <blue>0</blue>
                                    </color>
                                </active>
                                <disabled>
                                    <color>
                                        <red>128</red>
                                        <green>128</green>
                                        <blue>128</blue>
                                    </color>
                                    <color>
                                        <red>129</red>
                                        <green>140</green>
                                        <blue>199</blue>
                                    </color>
                                    <color>
                                        <red>208</red>
                                        <green>215</green>
                                        <blue>255</blue>
                                    </color>
                                    <color>
                                        <red>148</red>
                                        <green>160</green>
                                        <blue>228</blue>
                                    </color>
                                    <color>
                                        <red>64</red>
                                        <green>69</green>
                                        <blue>99</blue>
                                    </color>
                                    <color>
                                        <red>85</red>
                                        <green>92</green>
                                        <blue>132</blue>
                                    </color>
                                    <color>
                                        <red>128</red>
                                        <green>128</green>
                                        <blue>128</blue>
                                    </color>
                                    <color>
                                        <red>255</red>
                                        <green>255</green>
                                        <blue>255</blue>
                                    </color>
                                    <color>
                                        <red>128</red>
                                        <green>128</green>
                                        <blue>128</blue>
                                    </color>
                                    <color>
                                        <red>255</red>
                                        <green>255</green>
                                        <blue>255</blue>
                                    </color>
                                    <color>
                                        <red>165</red>
                                        <green>180</green>
                                        <blue>255</blue>
                                    </color>
                                    <color>
                                        <red>0</red>
                                        <green>0</green>
                                        <blue>0</blue>
                                    </color>
                                    <color>
                                        <red>0</red>
                                        <green>0</green>
                                        <blue>128</blue>
                                    </color>
                                    <color>
                                        <red>255</red>
                                        <green>255</green>
                                        <blue>255</blue>
                                    </color>
                                    <color>
                                        <red>0</red>
                                        <green>0</green>
                                        <blue>192</blue>
                                    </color>
                                    <color>
                                        <red>128</red>
                                        <green>0</green>
                                        <blue>128</blue>
                                    </color>
                                </disabled>
                                <inactive>
                                    <color>
                                        <red>0</red>
                                        <green>0</green>
                                        <blue>0</blue>
                                    </color>
                                    <color>
                                        <red>129</red>
                                        <green>140</green>
                                        <blue>199</blue>
                                    </color>
                                    <color>
                                        <red>208</red>
                                        <green>215</green>
                                        <blue>255</blue>
                                    </color>
                                    <color>
                                        <red>148</red>
                                        <green>160</green>
                                        <blue>228</blue>
                                    </color>
                                    <color>
                                        <red>64</red>
                                        <green>69</green>
                                        <blue>99</blue>
                                    </color>
                                    <color>
                                        <red>85</red>
                                        <green>92</green>
                                        <blue>132</blue>
                                    </color>
                                    <color>
                                        <red>0</red>
                                        <green>0</green>
                                        <blue>0</blue>
                                    </color>
                                    <color>
                                        <red>255</red>
                                        <green>255</green>
                                        <blue>255</blue>
                                    </color>
                                    <color>
                                        <red>0</red>
                                        <green>0</green>
                                        <blue>0</blue>
                                    </color>
                                    <color>
                                        <red>255</red>
                                        <green>255</green>
                                        <blue>255</blue>
                                    </color>
                                    <color>
                                        <red>165</red>
                                        <green>180</green>
                                        <blue>255</blue>
                                    </color>
                                    <color>
                                        <red>0</red>
                                        <green>0</green>
                                        <blue>0</blue>
                                    </color>
                                    <color>
                                        <red>0</red>
                                        <green>0</green>
                                        <blue>128</blue>
                                    </color>
                                    <color>
                                        <red>255</red>
                                        <green>255</green>
                                        <blue>255</blue>
                                    </color>
                                    <color>
                                        <red>0</red>
                                        <green>0</green>
                                        <blue>192</blue>
                                    </color>
                                    <color>
                                        <red>128</red>
                                        <green>0</green>
                                        <blue>128</blue>
                                    </color>
                                </inactive>
                            </palette>
                        </property>
                        <property name="frameShape">
                            <enum>StyledPanel</enum>
                        </property>
                        <property name="frameShadow">
                            <enum>Raised</enum>
                        </property>
                        <property name="lineWidth">
                            <number>4</number>
                        </property>
                        <property name="margin">
                            <number>0</number>
                        </property>
                        <property name="midLineWidth">
                            <number>2</number>
                        </property>
                    </widget>
                </widget>
                <widget class="QLabel">
                    <property name="name">
                        <cstring>textLabel1</cstring>
                    </property>
                    <property name="text">
                        <string>&lt;font size="-1"&gt;&lt;b&gt;Note:&lt;/b&gt; killing the process may cause the unexpected results&lt;/font&gt;</string>
                    </property>
                </widget>
                <widget class="QLayoutWidget">
                    <property name="name">
                        <cstring>layout65</cstring>
                    </property>
                    <hbox>
                        <property name="name">
                            <cstring>unnamed</cstring>
                        </property>
                        <spacer>
                            <property name="name">
                                <cstring>spacer26</cstring>
                            </property>
                            <property name="orientation">
                                <enum>Horizontal</enum>
                            </property>
                            <property name="sizeType">
                                <enum>Expanding</enum>
                            </property>
                            <property name="sizeHint">
                                <size>
                                    <width>40</width>
                                    <height>20</height>
                                </size>
                            </property>
                        </spacer>
                        <widget class="QPushButton">
                            <property name="name">
                                <cstring>btnCancel</cstring>
                            </property>
                            <property name="text">
                                <string>Kill process</string>
                            </property>
                            <property name="iconSet">
                                <iconset></iconset>
                            </property>
                        </widget>
                        <spacer>
                            <property name="name">
                                <cstring>spacer27</cstring>
                            </property>
                            <property name="orientation">
                                <enum>Horizontal</enum>
                            </property>
                            <property name="sizeType">
                                <enum>Expanding</enum>
                            </property>
                            <property name="sizeHint">
                                <size>
                                    <width>40</width>
                                    <height>20</height>
                                </size>
                            </property>
                        </spacer>
                    </hbox>
                </widget>
            </vbox>
        </widget>
    </grid>
</widget>
<connections>
    <connection>
        <sender>btnCancel</sender>
        <signal>clicked()</signal>
        <receiver>ProgressForm</receiver>
        <slot>btnCancel_clicked()</slot>
    </connection>
</connections>
<includes>
    <include location="local" impldecl="in implementation">ProgressForm.ui.h</include>
</includes>
<signals>
    <signal>killProcess()</signal>
</signals>
<slots>
    <slot>paintProcess()</slot>
    <slot>btnCancel_clicked()</slot>
    <slot>hideForm()</slot>
    <slot>showForm()</slot>
</slots>
<functions>
    <function access="private" specifier="non virtual">init()</function>
    <function>setText( QString text )</function>
</functions>
<pixmapinproject/>
<layoutdefaults spacing="6" margin="11"/>
</UI>


Когда надо выполнять какое-либо длинное действие просто показываешь пользователю диалог,  делаешь действие, переодически вызываея qApp->processEvents{}, когда действие закончилось диалог прячешь.


Название: Диалог ожидания
Отправлено: pish_r от Августа 09, 2005, 10:01
Большое Вам человеческое спасибо!


Название: Диалог ожидания
Отправлено: Hellenna от Августа 09, 2005, 14:15
Большое пожалуйста! :D


Название: Диалог ожидания
Отправлено: Hellenna от Августа 09, 2005, 14:18
Большое пожалуйста!  :D


Название: Диалог ожидания
Отправлено: Zigmar от Августа 09, 2005, 20:26
Hellenna, так обычный QProgressBar это уже сам умеет, надо просто выставить totalSteps в 0 и менять progress.

Цитировать
If the total is given as 0 the progress bar shows a busy indicator instead of a percentage of steps. This is useful, for example, when using QFtp or QHttp to download items when they are unable to determine the size of the item being downloaded.


Название: Диалог ожидания
Отправлено: Hellenna от Августа 10, 2005, 08:53
Может быть это появилось в последних версиях... когда я смотрела не было, или плохо смотрела... :roll: В любом случае, спасибо. теперь буду знать.


Название: Диалог ожидания
Отправлено: pish_r от Августа 10, 2005, 12:56
не ссортесь, мне предложенный диалог очень подошел


Название: Re: Диалог ожидания
Отправлено: kn0pka от Апреля 05, 2009, 13:30
Zigmar, только сейчас это уже немного по-другому делается. Надо minimum и maximum установить в 0.