Γραμμή προόδου
Οι γραμμές προόδου χρησιμοποιούνται για την εμφάνιση της κατάστασης της συνεχιζόμενης λειτουργίας. Για παράδειγμα, μια ProgressBar μπορεί να εμφανίσει πόση εργασία έχει ολοκληρωθεί.
To change the value shown, use the set_fraction() method, passing a double between 0.0 and 1.0 to provide the new fraction.
Μια ProgressBar είναι οριζόντια και από αριστερά προς τα δεξιά από προεπιλογή, αλλά μπορείτε να την αλλάξετε σε μια κάθετη γραμμή προόδου χρησιμοποιώντας τη μέθοδο set_orientation() method.
- 8.4.1. Κατάσταση δραστηριότητας
- 8.4.2. Παράδειγμα
8.4.1. Κατάσταση δραστηριότητας
Εκτός από την υπόδειξη του ποσού της προόδου που έχει συμβεί, η γραμμή προόδου μπορεί επίσης να χρησιμοποιηθεί για να δείξει ότι υπάρχει κάποια δραστηριότητα· αυτό γίνεται τοποθετώντας τη γραμμή προόδου στην κατάσταση δραστηριότητας. Σε αυτήν την κατάσταση, η γραμμή προόδου εμφανίζει ένα μικρό ορθογώνιο που μετακινείται πίσω και μπρος. Η κατάσταση δραστηριότητας είναι χρήσιμη σε περιπτώσεις, όπου η πρόοδος μιας λειτουργίας δεν μπορεί να υπολογιστεί ως μια περιοχή τιμών (π.χ., λήψη αρχείου άγνωστου μήκους).
Για να το κάνετε αυτό, χρειάζεται να καλέσετε τη μέθοδο pulse() σε κανονικά διαστήματα. Μπορείτε επίσης να επιλέξετε το μέγεθος βήματος, με τη μέθοδο set_pulse_step().
The progress bar can also display a configurable text string next to the bar, using the set_text() method.
8.4.2. Παράδειγμα
File: examplewindow.h (For use with gtkmm 4)
#ifndef GTKMM_EXAMPLEWINDOW_H #define GTKMM_EXAMPLEWINDOW_H #include <gtkmm.h> class ExampleWindow : public Gtk::Window { public: ExampleWindow(); virtual ~ExampleWindow(); protected: //Signal handlers: void on_checkbutton_text(); void on_checkbutton_activity(); void on_checkbutton_inverted(); bool on_timeout(); void on_button_close(); //Child widgets: Gtk::Box m_VBox; Gtk::Grid m_Grid; Gtk::ProgressBar m_ProgressBar; Gtk::Separator m_Separator; Gtk::CheckButton m_CheckButton_Text, m_CheckButton_Activity, m_CheckButton_Inverted; Gtk::Button m_Button_Close; sigc::connection m_connection_timeout; bool m_bActivityMode; }; #endif //GTKMM_EXAMPLEWINDOW_H
File: main.cc (For use with gtkmm 4)
#include "examplewindow.h" #include <gtkmm/application.h> int main(int argc, char *argv[]) { auto app = Gtk::Application::create("org.gtkmm.example"); //Shows the window and returns when it is closed. return app->make_window_and_run<ExampleWindow>(argc, argv); }
File: examplewindow.cc (For use with gtkmm 4)
#include "examplewindow.h" #include <iostream> ExampleWindow::ExampleWindow() : m_VBox(Gtk::Orientation::VERTICAL, 5), m_CheckButton_Text("Show text"), m_CheckButton_Activity("Activity mode"), m_CheckButton_Inverted("Right to Left"), m_Button_Close("Close"), m_bActivityMode(false) { set_resizable(); set_title("Gtk::ProgressBar"); m_VBox.set_margin(10); set_child(m_VBox); m_VBox.append(m_ProgressBar); m_ProgressBar.set_margin_end(5); m_ProgressBar.set_halign(Gtk::Align::CENTER); m_ProgressBar.set_valign(Gtk::Align::CENTER); m_ProgressBar.set_size_request(100, -1); m_ProgressBar.set_text("some text"); m_ProgressBar.set_show_text(false); //Add a timer callback to update the value of the progress bar: m_connection_timeout = Glib::signal_timeout().connect(sigc::mem_fun(*this, &ExampleWindow::on_timeout), 50 ); m_VBox.append(m_Separator); m_VBox.append(m_Grid); m_Grid.set_expand(true); m_Grid.set_row_homogeneous(true); //Add a check button to select displaying of the trough text: m_Grid.attach(m_CheckButton_Text, 0, 0); m_CheckButton_Text.set_margin(5); m_CheckButton_Text.signal_toggled().connect(sigc::mem_fun(*this, &ExampleWindow::on_checkbutton_text) ); //Add a check button to toggle activity mode: m_Grid.attach(m_CheckButton_Activity, 0, 1); m_CheckButton_Activity.set_margin(5); m_CheckButton_Activity.signal_toggled().connect(sigc::mem_fun(*this, &ExampleWindow::on_checkbutton_activity) ); //Add a check button to select growth from left to right or from right to left: m_Grid.attach(m_CheckButton_Inverted, 0, 2); m_CheckButton_Inverted.set_margin(5); m_CheckButton_Inverted.signal_toggled().connect(sigc::mem_fun(*this, &ExampleWindow::on_checkbutton_inverted) ); //Add a button to exit the program. m_VBox.append(m_Button_Close); m_Button_Close.signal_clicked().connect(sigc::mem_fun(*this, &ExampleWindow::on_button_close) ); set_default_widget(m_Button_Close); } ExampleWindow::~ExampleWindow() { } void ExampleWindow::on_checkbutton_text() { const bool show_text = m_CheckButton_Text.get_active(); m_ProgressBar.set_show_text(show_text); } void ExampleWindow::on_checkbutton_activity() { m_bActivityMode = m_CheckButton_Activity.get_active(); if(m_bActivityMode) m_ProgressBar.pulse(); else m_ProgressBar.set_fraction(0.0); } void ExampleWindow::on_checkbutton_inverted() { const bool inverted = m_CheckButton_Inverted.get_active(); m_ProgressBar.set_inverted(inverted); } void ExampleWindow::on_button_close() { hide(); } /* Update the value of the progress bar so that we get * some movement */ bool ExampleWindow::on_timeout() { if(m_bActivityMode) m_ProgressBar.pulse(); else { double new_val = m_ProgressBar.get_fraction() + 0.01; if(new_val > 1.0) new_val = 0.0; //Set the new value: m_ProgressBar.set_fraction(new_val); } //As this is a timeout function, return true so that it //continues to get called return true; }