- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在尝试使用 TreeView 列出目录的内容,然后通过在列表中选择文件名来选择文件名。我不想使用文件选择器对话框,因为我想限制用户访问一个目录并且不希望他们在系统中导航。在我想清除列表并更新它之前,我的代码工作正常。如果我访问了一行并读取了一个列值,那么当我清除列表或使用 treeselection unSelectAll() 时,我会得到错误:
Gtk-CRITICAL **: gtk_list_store_get_value: assertion 'iter_is_valid (iter, list_store)' failed
和
GLib-GObject-CRITICAL **: g_value_get_string: assertion 'G_VALUE_HOLDS_STRING (value)' failed
代码仍然有效,但我不喜欢这些错误。感觉好像我读错了行,但我看不出如何。请参阅我的代码:void fileForm::on_treeview_selected() 在最底部。变量“f”最初是“文件名”,但我更改了它以证明即使是应该丢弃的变量也会导致 iter 出现问题。该表单是在 Glade 中构建的,并使用 GTK::Builder 进行引用。我正在使用 Linux Mint 18.2`/*
/*
* 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
}
最佳答案
好吧,这花了我一段时间,但我通过检查 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() 才会导致错误。
关于c++ - Gtkmm3 TreeView ListStore.Clear 或 TreeSelection.unselectAll 导致错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47497378/
#include using namespace std; class C{ private: int value; public: C(){ value = 0;
这个问题已经有答案了: What is the difference between char a[] = ?string?; and char *p = ?string?;? (8 个回答) 已关闭
关闭。此题需要details or clarity 。目前不接受答案。 想要改进这个问题吗?通过 editing this post 添加详细信息并澄清问题. 已关闭 7 年前。 此帖子已于 8 个月
除了调试之外,是否有任何针对 c、c++ 或 c# 的测试工具,其工作原理类似于将独立函数复制粘贴到某个文本框,然后在其他文本框中输入参数? 最佳答案 也许您会考虑单元测试。我推荐你谷歌测试和谷歌模拟
我想在第二台显示器中移动一个窗口 (HWND)。问题是我尝试了很多方法,例如将分辨率加倍或输入负值,但它永远无法将窗口放在我的第二台显示器上。 关于如何在 C/C++/c# 中执行此操作的任何线索 最
我正在寻找 C/C++/C## 中不同类型 DES 的现有实现。我的运行平台是Windows XP/Vista/7。 我正在尝试编写一个 C# 程序,它将使用 DES 算法进行加密和解密。我需要一些实
很难说出这里要问什么。这个问题模棱两可、含糊不清、不完整、过于宽泛或夸夸其谈,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开,visit the help center . 关闭 1
有没有办法强制将另一个 窗口置于顶部? 不是应用程序的窗口,而是另一个已经在系统上运行的窗口。 (Windows, C/C++/C#) 最佳答案 SetWindowPos(that_window_ha
假设您可以在 C/C++ 或 Csharp 之间做出选择,并且您打算在 Windows 和 Linux 服务器上运行同一服务器的多个实例,那么构建套接字服务器应用程序的最明智选择是什么? 最佳答案 如
你们能告诉我它们之间的区别吗? 顺便问一下,有什么叫C++库或C库的吗? 最佳答案 C++ 标准库 和 C 标准库 是 C++ 和 C 标准定义的库,提供给 C++ 和 C 程序使用。那是那些词的共同
下面的测试代码,我将输出信息放在注释中。我使用的是 gcc 4.8.5 和 Centos 7.2。 #include #include class C { public:
很难说出这里问的是什么。这个问题是含糊的、模糊的、不完整的、过于宽泛的或修辞性的,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开它,visit the help center 。 已关
我的客户将使用名为 annoucement 的结构/类与客户通信。我想我会用 C++ 编写服务器。会有很多不同的类继承annoucement。我的问题是通过网络将这些类发送给客户端 我想也许我应该使用
我在 C# 中有以下函数: public Matrix ConcatDescriptors(IList> descriptors) { int cols = descriptors[0].Co
我有一个项目要编写一个函数来对某些数据执行某些操作。我可以用 C/C++ 编写代码,但我不想与雇主共享该函数的代码。相反,我只想让他有权在他自己的代码中调用该函数。是否可以?我想到了这两种方法 - 在
我使用的是编写糟糕的第 3 方 (C/C++) Api。我从托管代码(C++/CLI)中使用它。有时会出现“访问冲突错误”。这使整个应用程序崩溃。我知道我无法处理这些错误[如果指针访问非法内存位置等,
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以便用事实和引用来回答。 关闭 7 年前。
已关闭。此问题不符合Stack Overflow guidelines 。目前不接受答案。 要求我们推荐或查找工具、库或最喜欢的场外资源的问题对于 Stack Overflow 来说是偏离主题的,因为
我有一些 C 代码,将使用 P/Invoke 从 C# 调用。我正在尝试为这个 C 函数定义一个 C# 等效项。 SomeData* DoSomething(); struct SomeData {
这个问题已经有答案了: Why are these constructs using pre and post-increment undefined behavior? (14 个回答) 已关闭 6
我是一名优秀的程序员,十分优秀!