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 (комментарий))

★★

Последнее исправление: safocl (всего исправлений: 2)

Ответ на: комментарий от eternal_sorrow

возможно сделаю такое — но как енто поможет в данной ситуации?
другой способ наброса объектов сделает отображаемым лейблы?

safocl ★★
() автор топика

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

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

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

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

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

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

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

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

сделал на всех ячейках одинаковую ширину у grid — появилась пустая колонка между spinButton — label все равно не отображается

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

настройка расширяемости есть в самом label - его надо заставить расширятся там функции типа set_hexpand_set. Кроме того у grid есть такая настройка как гомогенность.

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

попробовал — ничего не помогает...

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

енти формы подключаются к wnotebook файлам — mainform пустой и неиспользуется

а ента конкретная форма — для wfraclock

safocl ★★
() автор топика
Последнее исправление: safocl (всего исправлений: 3)
Ответ на: комментарий от Silerus

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

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

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

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

вот как это выглядит в glade ui -как видите все нормально, причём даже без дополнительных настроек. Тут возможно эту строку вообще стоит создать как отдельный виджет

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

Gnome-builder имел ввиду, не придирайся злобный анонимус

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

Извините, укажите мне номер строки, где в грид Вы добавляете свой лайбел, и еще почему он у Вас один, когда их должно быть два?

Silerus ★★★★
()
Ответ на: комментарий от 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
()
Ответ на: комментарий от anonymous

ничо необычного, его бы не было у меня...

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

жалуется на ошибка: «UStringView» в пространстве имен «Glib» не именует тип 9 | const Glib::UStringView tabLabel1{"Alarm clock"}; Ну и на все аналогичное.

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

несколько раз позапускайте — должно запуститься
там енто наверно из-за того чо я еще не сделал grid на все вкладки и добавляется все на frame

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

ну у меня тоже несколько раз запускается с сегфолтом... я думал что енто из-за того чо лейбл на grid делаю...

safocl ★★
() автор топика
Ответ на: комментарий от 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 ★★★★
()
Ответ на: комментарий от Silerus

кстати — если указать тут в конструкторе инициализацию лейбла через ввод строки — лейбл отображается...

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

Пацаны, я не силен в ентом сцаном цепепе. Но могёт проблема в том, шо используется «.» вместо «->»?

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

правильно, у вас идет переинициализация всех элементов, у вас там память по идее течь должна.

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)
Ответ на: комментарий от safocl

если вы скопировали мои изменения - то там не только изменения порядка строк, там еще и изменения принципа инициализации объектов. В остальном - UB.

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

а чем вам не нравится инициализация в конструкторе через двоеточие?
типа

A::A() : f() {}

safocl ★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.