私はTreeViewを使用してディレクトリの内容をリストし、リストでファイル名を選択しようとしています。私はファイル選択ダイアログを使用したくないので、ユーザのアクセスを1つのディレクトリに制限し、システムの周りをナビゲートすることを望まない。 リストをクリアして更新するまで、自分のコードは正常に動作します。Gtkmm3 TreeView ListStore.ClearまたはTreeSelection.unselectAllによってエラーが発生します
を失敗)」アサーション:g_value_get_stringのGtk-CRITICAL **::gtk_list_store_get_value:アサーション「iter_is_valid(ITER、list_store私はその後、私はエラーを取得する)行にアクセスし、私はリストをクリアまたはtreeselection unSelectAllを(使用する場合、列の値を読んでいれば')G_VALUE_HOLDS_STRING(値
と
のGLib-GObjectのクリティカル**失敗' を
コードはまだ動作しますが、エラーは気に入らないのです。 私は間違って行を読んでいるように感じるが、私はどのように見ることができません。私のコードを参照してください:最下部にvoid fileForm :: on_treeview_selected()があります。変数 "f"はもともとは "filename"でしたが、破棄すべき変数でさえiterに問題を引き起こすことを証明するために変更しました。 フォームはGladeで構築され、GTK :: Builderを使用して参照されました。私は、まあ、それは私にしばらく時間がかかったが、私はtreeiterが有効だった場合
`void fileForm::on_treeview_selected() { Gtk::TreeIter treeiter = m_treeSelection->get_selected(); if (treeiter) { Gtk::TreeModel::Row row = *treeiter; m_filename = row.get_value(m_columns.m_col_name); } }`
がon_treeView_selectedようだ見るためにチェックすることで、メッセージを処分した
*//* * File: fileForm.h * Author: john * * Created on November 16, 2017, 6:26 PM */ #ifndef FILEFORM_H #define FILEFORM_H #include <gtkmm/builder.h> #include <gtkmm/treeview.h> #include <gtkmm/liststore.h> #include <gtkmm/scrolledwindow.h> #include <gtkmm/scrollbar.h> #include <gtkmm/cellrendererprogress.h> #include <gtkmm/button.h> #include <gtkmm/buttonbox.h> #include <gtkmm/box.h> #include <gtkmm/label.h> #include <gtkmm/entry.h> #include <gtkmm/window.h> #include <gtkmm/scrolledwindow.h> #include <sstream> #include <dirent.h> #include <string> #include "generalClasses.h" //not using Glade as can't do List Store so pointless class fileForm : public Gtk::Window { public: fileForm(BaseObjectType* cobject, const Glib::RefPtr<Gtk::Builder>& refGlade); fileForm(const fileForm& orig); virtual ~fileForm(); void show(std::string fileExtension = ""); std::string filename = ""; protected: Glib::RefPtr<Gtk::Builder> m_builder; std::string m_fileExtension; //Tree model columns: class ModelColumns : public Gtk::TreeModel::ColumnRecord { public: ModelColumns() { add(m_col_id); add(m_col_name); add(m_col_date);} Gtk::TreeModelColumn<unsigned int> m_col_id; Gtk::TreeModelColumn<Glib::ustring> m_col_name; Gtk::TreeModelColumn<Glib::ustring> m_col_date; }; ModelColumns m_columns; //Child widgets: Gtk::Button* m_topButton; Gtk::Button* m_upButton; Gtk::Button* m_downButton; Gtk::Button* m_bottomButton; Gtk::TreeView* m_treeView; Gtk::ScrolledWindow* m_scrolledWindow; Glib::RefPtr<Gtk::TreeSelection> m_treeSelection; Glib::RefPtr<Gtk::ListStore> m_refTreeModel; // Gtk::ListStore* m_refTreeModel; Gtk::Button* m_cancelButton; Gtk::Button* m_loadButton; private: //Signal handlers: void on_loadButton_clicked(); void on_cancelButton_clicked(); void on_topButton_clicked(); void on_upButton_clicked(); void on_downButton_clicked(); void on_bottomButton_clicked(); void on_treeview_selected(); }; #endif /* FILEFORM_H */ /* * File: fileForm.cpp * Author: john * * Created on November 16, 2017, 6:26 PM */ #include "fileForm.h" using namespace Glib; using namespace std; fileForm::fileForm(BaseObjectType* cobject, const Glib::RefPtr<Gtk::Builder>& refGlade) : Gtk::Window(cobject), m_builder(refGlade) { set_title("Select file"); m_builder->get_widget("topButton",m_topButton); m_builder->get_widget("upButton",m_upButton); m_builder->get_widget("downButton",m_downButton); m_builder->get_widget("bottomButton",m_bottomButton); m_builder->get_widget("cancelButton",m_cancelButton); m_builder->get_widget("loadButton",m_loadButton); m_builder->get_widget("treeview1",m_treeView); m_builder->get_widget("scrolledwindow1", m_scrolledWindow); m_refTreeModel = Gtk::ListStore::create(m_columns); m_treeView->set_model(m_refTreeModel); m_treeSelection = m_treeView->get_selection(); //Add the TreeView's view columns: //This number will be shown with the default numeric formatting. m_treeView->append_column("ID", m_columns.m_col_id); m_treeView->append_column("Name", m_columns.m_col_name); m_treeView->append_column("Date",m_columns.m_col_date); m_cancelButton->signal_clicked().connect(sigc::mem_fun(*this, &fileForm::on_cancelButton_clicked)); m_loadButton->signal_clicked().connect(sigc::mem_fun(*this, &fileForm::on_loadButton_clicked)); m_treeSelection->signal_changed().connect(sigc::mem_fun(*this, &fileForm::on_treeview_selected),false); } void fileForm::show(std::string fileExtension){ //open file and list int rowCount = 0; char buffer[30]; DIR *d; struct dirent *dir; struct stat fileAttrib; string s; int pointPos; filename = ""; m_treeSelection->unselect_all(); //fault occurs on this line if the row.get_value was used m_refTreeModel->clear(); //fault occurs on this line if the row.get_value was used d = opendir("."); if (d) { while ((dir = readdir(d)) != NULL) { stat(dir->d_name, &fileAttrib); s = dir->d_name; pointPos = s.find("." + fileExtension); s = s.substr(0,pointPos); //Fill the TreeView's model if ((s !=".") && (s !="..") && (s != "") && (pointPos > 0)) //show only files and no directories { Gtk::TreeModel::Row row = *(m_refTreeModel->append()); row[m_columns.m_col_id] = ++rowCount; row[m_columns.m_col_name] = s; timespecToStr(buffer, &fileAttrib.st_mtim); if (buffer != NULL) row[m_columns.m_col_date] = buffer; } } } if (rowCount < 12) //nasty but itll do for now { m_treeView->set_size_request(400,-1); m_topButton->set_sensitive(false); m_upButton->set_sensitive(false); m_downButton->set_sensitive(false); m_bottomButton->set_sensitive(false); } else { m_treeView->set_size_request(400,400); m_topButton->set_sensitive(true); m_upButton->set_sensitive(true); m_downButton->set_sensitive(true); m_bottomButton->set_sensitive(true); } //Make all the columns reorderable: //This is not necessary, but it's nice to show the feature. //You can use TreeView::set_column_drag_function() to more //finely control column drag and drop. /* for(guint i = 0; i < 3; i++) { auto column = m_treeView->get_column(i); column->set_reorderable(); } */ m_loadButton->set_sensitive(false); //disabled until a selection is made m_cancelButton->grab_focus(); Gtk::Window::show_all(); } void fileForm::on_loadButton_clicked() { //filename selected when tree selected filename += "." + m_fileExtension; hide(); } void fileForm::on_cancelButton_clicked() { filename = ""; hide(); } void fileForm::on_treeview_selected() { ustring f = ""; m_loadButton->set_sensitive(true); //disabled until a selection is made Gtk::TreeIter treeiter = m_treeSelection->get_selected(); Gtk::TreeModel::Row row = *treeiter; f = row.get_value(m_columns.m_col_name); //not using f this is just to test, fault still occurs //removing the row above stops the error occuring }