如何在文件 .cpp gtkmm 中声明小部件
How to declared widget in file .cpp gtkmm
我有一个像这样的简单 gtkmm 程序:
文件main.cpp:
#include "mainwindow.h"
#include <gtkmm/application.h>
int main(int argc, char *argv[])
{
auto app = Gtk::Application::create(argc, argv, "org.gtkmm.example");
MainWindow window;
//Shows the window and returns when it is closed.
return app->run(window);
}
文件mainwindow.h:
#include <gtkmm/window.h>
#include <gtkmm.h>
class MainWindow : public Gtk::Window {
public:
MainWindow();
virtual ~MainWindow();
protected:
Gtk::Label myLabel;
};
和文件 mainwindow.cpp:
#include "mainwindow.h"
#include <iostream>
//using namespace gtk;
MainWindow ::MainWindow():myLabel("this is Label")
{
add(myLabel);
show_all_children();
}
MainWindow::~MainWindow() {}
这段代码 运行 可以。但是现在我想像这样在文件 mainwindow.cpp 中声明一个标签:
#include "mainwindow.h"
#include <iostream>
MainWindow ::MainWindow():myLabel("this is Label")
{
Gtk::Label myLabel2("this is label 2");
add(myLabel2);
show_all_children();
}
MainWindow::~MainWindow() {}
当我 运行 这段代码时标签不显示,有人能告诉我哪里错了吗?感谢您的帮助!
标签没有出现,因为它在范围的末尾被销毁(即在构造函数的末尾)。
为了避免这种情况,您需要在堆上分配标签。但是,为避免内存泄漏,您应该使用 Gtk::manage 函数,这样标签的内存将由容器管理 [1].
Gtk::Label* myLabel2 = Gtk::manage(new Gtk::Label("this is label 2"));
add(myLabel2);
show_all_children();
[1] https://developer.gnome.org/gtkmm-tutorial/stable/sec-memory-widgets.html.en#memory-managed-dynamic
你这里有两个问题。首先 myLabel2
超出范围,构造函数结束并被销毁。第二个是 Gtk::Window
作为单个项目容器,只能容纳一个小部件。
myLabel2
超出范围的解决方案是在堆上分配它,请参阅@Marcin Kolny 的回答。或者像 myLabel
.
那样构造它
对于第二期,需要将多项目容器添加到您的 Gtk::Window
,然后您可以将其他小部件添加到其中。这个容器可以是Gtk::Box
、Gtk::Grid
等...这取决于你的需要。
许多可能的解决方案之一是:
mainwindow.h
#include <gtkmm.h>
class MainWindow : public Gtk::Window {
public:
MainWindow();
virtual ~MainWindow();
protected:
Gtk::Box myBox;
Gtk::Label myLabel;
Gtk::Label myLabel2;
};
mainwindow.cpp
#include "mainwindow.h"
MainWindow::MainWindow():
myLabel("this is Label"), myLabel2("this is label 2");
{
add myBox;
myBox.pack_start(myLabel);
myBox.pack_start(myLabel2);
show_all_children();
}
MainWindow::~MainWindow() {}
我有一个像这样的简单 gtkmm 程序:
文件main.cpp:
#include "mainwindow.h"
#include <gtkmm/application.h>
int main(int argc, char *argv[])
{
auto app = Gtk::Application::create(argc, argv, "org.gtkmm.example");
MainWindow window;
//Shows the window and returns when it is closed.
return app->run(window);
}
文件mainwindow.h:
#include <gtkmm/window.h>
#include <gtkmm.h>
class MainWindow : public Gtk::Window {
public:
MainWindow();
virtual ~MainWindow();
protected:
Gtk::Label myLabel;
};
和文件 mainwindow.cpp:
#include "mainwindow.h"
#include <iostream>
//using namespace gtk;
MainWindow ::MainWindow():myLabel("this is Label")
{
add(myLabel);
show_all_children();
}
MainWindow::~MainWindow() {}
这段代码 运行 可以。但是现在我想像这样在文件 mainwindow.cpp 中声明一个标签:
#include "mainwindow.h"
#include <iostream>
MainWindow ::MainWindow():myLabel("this is Label")
{
Gtk::Label myLabel2("this is label 2");
add(myLabel2);
show_all_children();
}
MainWindow::~MainWindow() {}
当我 运行 这段代码时标签不显示,有人能告诉我哪里错了吗?感谢您的帮助!
标签没有出现,因为它在范围的末尾被销毁(即在构造函数的末尾)。 为了避免这种情况,您需要在堆上分配标签。但是,为避免内存泄漏,您应该使用 Gtk::manage 函数,这样标签的内存将由容器管理 [1].
Gtk::Label* myLabel2 = Gtk::manage(new Gtk::Label("this is label 2"));
add(myLabel2);
show_all_children();
[1] https://developer.gnome.org/gtkmm-tutorial/stable/sec-memory-widgets.html.en#memory-managed-dynamic
你这里有两个问题。首先 myLabel2
超出范围,构造函数结束并被销毁。第二个是 Gtk::Window
作为单个项目容器,只能容纳一个小部件。
myLabel2
超出范围的解决方案是在堆上分配它,请参阅@Marcin Kolny 的回答。或者像 myLabel
.
对于第二期,需要将多项目容器添加到您的 Gtk::Window
,然后您可以将其他小部件添加到其中。这个容器可以是Gtk::Box
、Gtk::Grid
等...这取决于你的需要。
许多可能的解决方案之一是:
mainwindow.h
#include <gtkmm.h>
class MainWindow : public Gtk::Window {
public:
MainWindow();
virtual ~MainWindow();
protected:
Gtk::Box myBox;
Gtk::Label myLabel;
Gtk::Label myLabel2;
};
mainwindow.cpp
#include "mainwindow.h"
MainWindow::MainWindow():
myLabel("this is Label"), myLabel2("this is label 2");
{
add myBox;
myBox.pack_start(myLabel);
myBox.pack_start(myLabel2);
show_all_children();
}
MainWindow::~MainWindow() {}