我有两个GTK窗口
正常(主)窗口运行动画,在注册的回调中绘制内容gtk_widget_add_tick_callback()
.
在某些时候,创建了运行模态循环的辅助窗口:
void show_modal()
{
GtkWindow* gw = gtkwindow(this);
if( parent() )
gtk_window_set_transient_for(gw, gtkwindow( parent() ));
gtk_widget_show(GTK_WIDGET(gw));
gtk_window_set_modal(gw,TRUE);
gtk_window_set_keep_above(gw,TRUE);
this->update_window_state(gool::WINDOW_SHOWN);
while( this->is_valid_window() )
{
if(this->_window_state == WINDOW_HIDDEN) break;
if(this->_window_state == WINDOW_STATE_NA) break;
gtk_main_iteration(); // gtk_main_iteration_do(true);
}
}
Run Code Online (Sandbox Code Playgroud)问题:主窗口中的动画工作正常,直到show_modal()
被调用.它显示为gtk_main_iteration();
按gtk_widget_add_tick_callback()
功能添加的块标记.一旦我关闭辅助窗口,所以while() {gtk_main_iteration();}
循环退出然后主窗口中的动画再次开始运行.
想知道如何在GTK中制作"动画友好"的模态循环吗?
更新:gtk_main_iteration();
除了"当前"之外,它看起来像块不仅是滴答而是任何窗口的任何更新 - 它们只是被冻结.这种GTK行为的原因是什么?
更新#2:
gtk_dialog_run();
表现完全一样gtk_main_iteration();
- 锁定活动窗口以外的任何窗口上的任何更新.
我试图将我的应用程序从linux移植到Windows,我有一个主题问题.在Linux中,这是一个盒子,只需编译它,应用程序使用良好的主题,看起来像本机.
我在MSYS2中安装了gtkmm3和gtk3,我正在用CMake构建它.这没关系,我不得不将所有dll复制到二进制目录以便能够执行它.我没有复制任何其他内容.我正在尝试创建"解压缩和执行"包.
我的问题是,该应用程序看起来不合适.它看起来并不原生.窗口周围有阴影,这在Windows10中很好,但在Windows 7中它看起来不是原生的.还缺少几个图标.
甚至gitk3-demo也以相同的方式看起来非原生(但它至少有最小化/最大化/关闭图标正确).
所以问题是:如何在Windows上实现GTK3应用程序的原生外观?或者至少是原生的窗户装饰品?
谢谢
GTK3 应用程序可以使用 CSS 设置样式和主题。如何强制 GTK仅使用我的应用程序附带的 CSS,而不是将它与用户系统上安装的主题组合/级联?
为什么要这样做?从理论上讲,CSS 将是一个很棒的基于规则的样式系统,您只需添加一个屏幕完整的明智选择的规则来一致地定义应用程序的外观。不幸的是,在实践中,人们倾向于在他们的样式表中添加数百个脑残的、重复的定义,从而伪造级联的本质。
实际问题是,无论用户系统上安装的全局主题如何,我的应用程序都将获得媒体处理应用程序的典型、柔和的深灰色外观。通过阅读 GTK 文档和GTKmm 教程,我想出了以下代码来阅读我自己的 CSS 样式表:
auto screen = Gdk::Screen::get_default();
auto css_provider = Gtk::CssProvider::create();
try {
css_provider->load_from_path(lib::resolveModulePath (stylesheetName, resourceSerachPath));
} catch(Glib::Error const& failure) {
WARN(gui, "Failure while loading stylesheet '%s': %s", cStr(stylesheetName), cStr(failure.what()));
}
Gtk::StyleContext::add_provider_for_screen(screen, css_provider, GTK_STYLE_PROVIDER_PRIORITY_APPLICATION);
Run Code Online (Sandbox Code Playgroud)
从技术上讲,这很完美。但是——现在我被迫“反对”用户系统上存在的 CSS 规则。如果我开始在默认规则中设置合适的边框颜色,并在 GtkWindow 的规则中设置深灰色背景和合适的文本颜色,再加上一些文本输入字段的规则,我会在某些部分获得所需的外观,但是每当用户的系统主题为某些特定小部件或小部件组合添加了特定定义,从而明确重复颜色而不是从通用规则继承它们,我需要将另一个特定规则添加到我的应用程序样式表中以修复该特定情况。也就是说,已安装系统主题的可能错误引导的结构迫使我的应用程序样式表采用相同的错误引导的不良做法,并且有数百个单例定义一遍又一遍地重复相同的值。
我在GTK3中无法获取TreeView来正确包装文本。
我将其设置为以这种方式包装:
Gtk::TreeViewColumn* pColumn = mTreeView.get_column(2);
static_cast<Gtk::CellRendererText *>(pColumn->get_first_cell())
->property_wrap_mode().set_value(Pango::WRAP_WORD_CHAR);
static_cast<Gtk::CellRendererText *>(pColumn->get_first_cell())
->property_wrap_width().set_value(200);
Run Code Online (Sandbox Code Playgroud)
这可以工作,文本被换行,但是当我调整窗口大小并使其变大时,带有长文本的单元格上方和下方都有很多难看的空白。看来,GTK根据换行宽度为单元格保留了高度。这对我来说毫无意义。
我试图通过计算所需的宽度来解决signal_check_resize中所需的设置:
Gtk::TreeViewColumn* pColumn = mTreeView.get_column(2);
auto width = this->get_allocated_width()
- mTreeView.get_column(0)->get_width()
- mTreeView.get_column(1)->get_width();
static_cast<Gtk::CellRendererText *>(pColumn->get_first_cell())
->property_wrap_width().set_value(width-100);
this->forceRecreateModel = true; //Needed to work
Run Code Online (Sandbox Code Playgroud)
但这只能使窗口变大。调整大小后无法缩小。
问题是,如何正确地做到这一点?
我在Arch Linux上使用gtk3.20.3-1和gtkmm3.20.1-1。
编辑:标题中的固定错字...
该GtkOverlay
小部件有一个特殊的set_overlay_pass_through
方法将输入传递到底层覆盖层。我想使用此功能GtkDrawingArea
在 UI 上叠加来添加绘图。不幸的是,它对我不起作用,没有输入事件被传递。
我正在使用msys2
和gtkmm
。
这是我的代码:
Gtk::DrawingArea drawingArea;
Gtk::Fixed nodeBox; //filled with several widgets
Gtk::Overlay overlay;
overlay.add_overlay(nodeBox);
overlay.add_overlay(drawingArea);
overlay.set_overlay_pass_through(drawingArea,true);
window.add(overlay);
Run Code Online (Sandbox Code Playgroud)
当我更改两个add_overlay
调用的顺序时,输入事件正常工作,但nodeBox
隐藏绘图区域的小部件。
我正在研究 gtkmm 文档。我首先尝试编译“简单示例”。这是代码。也可以在这里找到。
/// SimpleExample.cpp
#include <gtkmm.h>
int main(int argc, char *argv[])
{
auto app =
Gtk::Application::create(argc, argv,
"org.gtkmm.examples.base");
Gtk::Window window;
window.set_default_size(200, 200);
return app->run(window);
}
Run Code Online (Sandbox Code Playgroud)
我尝试使用以下方法编译它
g++ SimpleExample.cpp -o SimpleExample `pkg-config gtkmm-3.0 --cflags --libs`
Run Code Online (Sandbox Code Playgroud)
应该根据文档工作。(参见链接页面末尾。)
跑步pkg-config gtkmm-3.0 --cflags --libs
产生
Package gtkmm-3.0 was not found in the pkg-config search path.
Perhaps you should add the directory containing `gtkmm-3.0.pc'
to the PKG_CONFIG_PATH environment variable
No package 'gtkmm-3.0' found
Run Code Online (Sandbox Code Playgroud)
我正在运行 Debian 9 Stretch。我安装gtkmm
了
sudo apt update …
Run Code Online (Sandbox Code Playgroud) 似乎很难找到有关 Gtkmm 主题的高质量文档。
Gtkmm 有好的文档吗?如果有的话,我在哪里可以找到它?
在开始之前,我知道 的存在GResource
,但是我正在使用 gtkmm (C++),并且我不确定 GResource 是否适用于 C++。我找不到任何东西Glib::GResource
,我已经找了一段时间了。
无论如何,我正在使用 Gtkmm 编写一个 GUI,并且我想打包在可执行文件中加载的 .glade 文件,以便可执行文件可以运行,而无需在其旁边有文件。我不确定我是否完全理解 GResources 是如何工作的,而且我在任何地方都找不到任何明确的说明。
那么,使用 Gtkmm,我如何将 .glade 文件打包到可执行文件中?
更新:我发现了这个。(Gio::Resource),听起来很有希望,但没有文档。