Re: changing the content of a model/view/store at run time
pcr <[email protected]>
| Newsgroups | gmane.comp.gnome.gtkmm |
|---|---|
| Message-ID | <[email protected]> |
A grand "Thank you" to Daniel Boles and Phil Wolff for their help. I
had been mixing up gtk and gtkmm documentation! I am attaching the
complete now working code for anyone interested.
On 8/10/19 10:04 AM, Phil Wolff via gtkmm-list wrote:
> As indicated by the error message, liststore1 is a RefPtr to a
> ListStore model, which is a C++ entity that
>
> 1) cannot be used as an argument to a gtk+ function, and
>
> 2) cannot be dereferenced with the * operator.
>
> At a more fundamental level, this approach is unnecessarily
> complicated. The entire contents of the function can be replace with a
> single statement:
>
> liststore1->clear ();
>
>
> On 8/10/19 8:20 AM, pcr wrote:
>>
>> I have changed from a tree store to a list store now, and I have
>> working code, except for the last line in this call back used when a
>> radio button is clicked in order to erase the list store and replace
>> it with another at run time:
>>
>> void ExampleWindow::on_rb2_clicked()
>> {
>> std::cout << "rb2 clicked" << std::endl;
>>
>> typedef Gtk::TreeModel::Children type_children;
>> type_children children = liststore1->children();
>> type_children::iterator iter;
>> for(iter=children.begin(); iter!=children.end(); ++iter)
>> gtk_list_store_remove (*liststore1,*iter);
>>
>> }
>>
>> The compiler message I get is
>>
>> test3.cc: In member function ‘void ExampleWindow::on_rb2_clicked()’:
>> test3.cc:104:27: error: no match for ‘operator*’ (operand type is
>> ‘Glib::RefPtr<Gtk::ListStore>’)
>> gtk_list_store_remove (*liststore1,*iter);
>>
>> So my question is, I suppose, what is the proper syntax for using
>> gtk_list_store_remove ???
>>
>> On 8/8/19 3:46 PM, pcr wrote:
>>>
>>> I'm trying to learn how to iterate over model rows in a manner
>>> similar to the code segment in section 9.3 of the gnome gtkmm
>>> tutorial. Consider me a newbie; the "something" I want to do below
>>> is delete/clear/erase a row - really all rows so I can display a new
>>> set of rows in response to a user action like changing a radio
>>> button. But I haven't been able to do it. Here is the snippit from
>>> section 9.3:
>>>
>>> typedef Gtk::TreeModel::Children type_children; //minimise code length.
>>> type_children children = refModel->children();
>>> for(type_children::iterator iter = children.begin();
>>> iter != children.end(); ++iter)
>>> {
>>> Gtk::TreeModel::Row row = *iter;
>>> //Do something with the row - see above for set/get.
>>> }
>>>
>>> *I'm also confused by the following comment I found on line; I don't
>>> see how this can work with the above code either. ***
>>> iterator Gtk::TreeStore:erase(const iterator& iter)
>>> Returns an iterator to the next row or end() if there is none"
>>>
>>> I hope you can help me . Thanks, PCR
>>>
>>>
>>> _______________________________________________
>>> gtkmm-list mailing list
>>> [email protected]
>>> https://mail.gnome.org/mailman/listinfo/gtkmm-list
>>
>> _______________________________________________
>> gtkmm-list mailing list
>> [email protected]
>> https://mail.gnome.org/mailman/listinfo/gtkmm-list
_______________________________________________
gtkmm-list mailing list
[email protected]
https://mail.gnome.org/mailman/listinfo/gtkmm-list
test3.cc
(text/x-c++src, 3.1 KB)
//compile me with: g++ -g -Wall -o test3 test3.cc `(pkg-config --cflags --libs gtkmm-3.0)`
#include <gtkmm.h>
#include <iostream>
#include <gtkmm/application.h>
class ExampleWindow : public Gtk::Window
{
public:
ExampleWindow();
virtual ~ExampleWindow();
protected:
//Signal handlers:
void on_rb1_clicked();
void on_rb2_clicked();
void on_treeview_row_activated(const Gtk::TreeModel::Path& path,
Gtk::TreeViewColumn* column);
//Tree model columns:
class ModelColumns : public Gtk::TreeModel::ColumnRecord
{
public:
ModelColumns(){ add(columnid); add(columnname);}
Gtk::TreeModelColumn<unsigned int> columnid;
Gtk::TreeModelColumn<Glib::ustring> columnname;
};
ModelColumns modelcolumns; //the ModelColumns object
//Child widgets:
Gtk::Box vbox1;
Gtk::Box hbox1;
Gtk::RadioButton rb1, rb2;
Gtk::ScrolledWindow scroll1;
Gtk::TreeView treeview1;
Glib::RefPtr<Gtk::ListStore> liststore1;
};
ExampleWindow::ExampleWindow():vbox1(Gtk::ORIENTATION_VERTICAL),hbox1(Gtk::ORIENTATION_HORIZONTAL),rb1("with Model1"),rb2("Model2")
{
set_title("Gtk::TreeView (ListStore) with callbacks");
set_border_width(5);
set_default_size(400, 400);
rb2.join_group(rb1);
add(vbox1);
vbox1.add(hbox1);
hbox1.pack_start(rb1);
hbox1.pack_end(rb2);
//Add the TreeView, inside a ScrolledWindow
scroll1.add(treeview1);
scroll1.set_min_content_height(400);
//Only show the scrollbars when they are necessary:
scroll1.set_policy(Gtk::POLICY_AUTOMATIC, Gtk::POLICY_AUTOMATIC);
vbox1.add(scroll1);
//Create the Tree model:
liststore1 = Gtk::ListStore::create(modelcolumns);
treeview1.set_model(liststore1);
//Add the TreeView's view columns:
treeview1.append_column("ID", modelcolumns.columnid);
treeview1.append_column("Name", modelcolumns.columnname);
//Conection from signals to callbacks
rb1.signal_clicked().connect(sigc::mem_fun(*this,&ExampleWindow::on_rb1_clicked));
rb2.signal_clicked().connect(sigc::mem_fun(*this,&ExampleWindow::on_rb2_clicked));
treeview1.signal_row_activated().connect( sigc::mem_fun(*this,
&ExampleWindow::on_treeview_row_activated));
show_all_children();
}
void ExampleWindow::on_rb1_clicked()
{
int count=5;
std::string names[count] = {"alpha", "beta", "gamma", "delta", "epsilon"};
liststore1->clear();
for(int j=0;j<count;j++)
{
Gtk::TreeModel::Row row = *(liststore1->append());
row[modelcolumns.columnid] = j;
row[modelcolumns.columnname] = names[j];
}
}
void ExampleWindow::on_rb2_clicked()
{
std::string newnames[]= {"Alpha", "Beta", "Gamma", "Delta", "Epsilon"};
liststore1->clear();
int count=5;
for(int j=0;j<count;j++)
{
Gtk::TreeModel::Row row = *(liststore1->append());
row[modelcolumns.columnid] = j;
row[modelcolumns.columnname] = newnames[j];
}
}
void ExampleWindow::on_treeview_row_activated(const Gtk::TreeModel::Path& path,
Gtk::TreeViewColumn*)
{
std::cout << "row_activated has been called" << std::endl;
}
ExampleWindow::~ExampleWindow()
{
}
int main(int argc, char *argv[])
{
auto app = Gtk::Application::create(argc,argv, "org.pcrt.example");
ExampleWindow window;
return app->run(window);
}