LINUX.ORG.RU

Gtk::grid плюс Gtk::label равно segfault

 ,


0

1

archlinux...
делаю будильник+таймер+логгер на gtkmm3, столкнулся с проблемой, что на сетке grid не отображается label — который я хотел использовать как разделитель ":" между spinButton — часы минуты секунды...

исходники :
clockentity.hpp

clockentity.cpp
если аттачить к grid данный delimiter то он не отображается и spin_buttton располагаются вплотную, вдобавок прога сегфолтится периодически при запуске.

как сделать красиво в данном случае?
https://i.imgur.com/c3CljDZ.png
вот тут необходимо между spinButton сделать разделители ":".


p.s. ответ найден — проблема была в ошибке в коде — инициализация строки была позже инициализации Gtk::Label — из-за чего последний инициализировался в конструкторе мусором.
ссылки на решение:
[тут](Gtk::grid плюс Gtk::label равно segfault (комментарий))
[или тут](Gtk::grid плюс Gtk::label равно segfault (комментарий))

★★

Воять интерфейс все же удобнее визуально, например через glade или через GtkBuilder. Там можно настраивать элементы визуально. Кроме того, я так понимаю у вас там выходит список таймеров, который пользователь может настраивать и добавлять. Лучше это будет сделать через GtkTreeView, поля таблицы могут быть и виджетами.

Silerus ★★★ ()
Ответ на: комментарий от Silerus

Лучше это будет сделать через GtkTreeView, поля таблицы могут быть и виджетами.

да я смотрел уже на ентот вариант — может и надо, только надо разобраться с ентим..

однако енто не отвечает на вопрос по какой причине сча не отображаются лейблы? — они и не должны отображаться в grind, или енто я не правильно делаю?

safocl ★★ ()
Ответ на: комментарий от safocl

там есть параметр, как ведет себя виджет, он может расширятся/занимать фиксированное положение/по содержимому и тп. В графическом редакторе, этот параметр можно настраивать в настройках виджета , в коде это ,будет выглядеть как то так m_HBox.pack_start(m_VBox, Gtk::PACK_SHRINK); - это я взял из документации Gtk::PACK_* -это тот параметр. Т.е у вас ваши лайблы сжимаются до нуля

Silerus ★★★ ()
Ответ на: комментарий от Silerus

Воять интерфейс все же удобнее визуально, например через glade или через GtkBuilder

Glade - это программа для визуального создания интерфейсов. Тут все понятно.

GtkBuilder - это не программа, это набор функций для кодинга - парсинга и трансляции xml-описания gui. Как ты собрался «воять» визуально?

anonymous ()
Ответ на: комментарий от safocl

Вот шаблон из Gnome Biulder:

#include "temp_cpp-window.h"

Temp_cppWindow::Temp_cppWindow()
	: Glib::ObjectBase("Temp_cppWindow")
	, Gtk::Window()
	, headerbar(nullptr)
	, label(nullptr)
{
	builder = Gtk::Builder::create_from_resource("/org/example/App/temp_cpp-window.ui");
	builder->get_widget("headerbar", headerbar);
	builder->get_widget("label", label);
	add(*label);
	label->show();
	set_titlebar(*headerbar);
	headerbar->show();
}

anonymous ()
Ответ на: комментарий от safocl

Дебагер показывает что это происходит при инициализации запчастей от вашего виджета будильника. 10 строка возможно это ваш лайбл. Пока почему это происходит не будет ясно - дальше даже думать не стоит.

Silerus ★★★ ()
Ответ на: комментарий от safocl

правильный ответ вот так вот:


ClockEntity::ClockEntity() :
spHours( Gtk::Adjustment::create( 0, 0, 23, 1, 1, 0 ) ),
spMinutes( Gtk::Adjustment::create( 0, 0, 59, 1, 1, 0 ) ),
spSeconds( Gtk::Adjustment::create( 0, 0, 59, 1, 1, 0 ) ),
sw()  {
  delimiter.set_text(delimiterString );```

Вообщем потому и segmetation fault, нельзя так текст вставлять в label
Silerus ★★★ ()
Ответ на: комментарий от safocl

я переписал ваши файлы немного вот так должно быть все как надо hpp

class ClockEntity final : public Gtk::Grid {
  Gtk::SpinButton     spHours{ Gtk::Adjustment::create( 0, 0, 23, 1, 1, 0 )},
    spMinutes{ Gtk::Adjustment::create( 0, 0, 59, 1, 1, 0 )},
    spSeconds{ Gtk::Adjustment::create( 0, 0, 59, 1, 1, 0 )};
    Gtk::Switch         sw;
const Glib::ustring delimiterString { ":" };
  Gtk::Label          delimiter{delimiterString};
  

    bool onSwStateSet(bool state );
    void onFlagChanged(Gtk::StateFlags previous_state_flags);

public:
    ClockEntity();
    ~ClockEntity();
};

cpp

ClockEntity::ClockEntity() 
  {
Silerus ★★★ ()
Ответ на: комментарий от Silerus

я понял в чем мой код косячен был — там просто надо переставить было вверх «const Glib::ustring delimiterString { »:" };" — перед «Gtk::Label delimiter{delimiterString};» — типа инициализация той строки была после лейбла...

safocl ★★ ()
Ответ на: комментарий от safocl

а по чему тогда ентот конструктор не работает?

Потому что вы пытаетесь вызвать конструктор повторно для уже существующего объекта, иначе вам следовало использовать указатели

Silerus ★★★ ()
Последнее исправление: Silerus (всего исправлений: 1)