Glade 对话框按钮响应 ID 灰显

Posted

技术标签:

【中文标题】Glade 对话框按钮响应 ID 灰显【英文标题】:Glade dialog button response ID grayed out 【发布时间】:2014-06-19 07:53:33 【问题描述】:

我在底部的正常操作区域中有一个带有确定和取消的首选项对话框。我还有一个浏览按钮,我不想把它放在对话框的底部。

所以我的浏览按钮位于顶部,但我无法为其设置响应 ID。按钮属性中的响应 ID 字段显示为灰色。我试图将我所有的对话框小部件移动到操作区域,但这也无济于事。

如何让我的浏览按钮返回响应 ID 而不将其移动到对话框底部?

编辑:

据我了解,gtk 对话框不是为使用按钮而设计的,除非它们位于底部。我决定放弃对话的想法,转而使用另一个窗口。这样我就可以使用现有的代码来挂钩按钮事件......我希望。

但在编译以下测试应用时遇到了问题。任何想法是什么问题?

控制台输出:

g++ main.cpp examplewindow.cpp subwindow.cpp -o testsubwindow.exe -I .\ %GTKMM_INCLUDES% %GTKMM_LIBS%
\AppData\Local\Temp\ccekbJuk.o:examplewindow.cpp:(.text+0x1b0d):
undefined reference to `ExampleSubWindow::~ExampleSubWindow()'
\AppData\Local\Temp\ccekbJuk.o:examplewindow.cpp:(.text+0x1b1e):
undefined reference to `ExampleSubWindow::~ExampleSubWindow()'
c:/mingw/bin/../lib/gcc/mingw32/4.8.1/../../../../mingw32/bin/ld.exe:
\Local\Temp\ccekbJuk.o: bad reloc address 0xf in section `.text$_ZN
4sigc8internal8slot_repC2EPFPvS2_ES4_S4_[__ZN4sigc8internal8slot_repC2EPFPvS2_ES4_S4_]'
collect2.exe: error: ld returned 1 exit status

main.cpp:

#include "examplewindow.h"
#include <gtkmm/application.h>

int main(int argc, char *argv[])

  Glib::RefPtr<Gtk::Application> app = Gtk::Application::create(argc, argv,     "org.gtkmm.example");

  ExampleWindow window;

  //Shows the window and returns when it is closed.
  return app->run(window);

examplewindow.h:

#ifndef GTKMM_EXAMPLEWINDOW_H
#define GTKMM_EXAMPLEWINDOW_H

#include <gtkmm.h>

class ExampleWindow : public Gtk::Window

public:
  ExampleWindow();
  virtual ~ExampleWindow();

protected:
  //Signal handlers:
  void on_button_clicked();
  void on_button2_clicked();
  void on_about_dialog_response(int response_id);

  //Child widgets:
  Gtk::Box m_VBox;
  Gtk::Label m_Label;
  Gtk::ButtonBox m_ButtonBox;
  Gtk::ButtonBox m_ButtonBox2;
  Gtk::Button m_Button;
  Gtk::Button m_Button2;
  Gtk::Window m_SubWindow;
  Gtk::AboutDialog m_Dialog;
;

class ExampleSubWindow : public Gtk::Window

    public:
        ExampleSubWindow();
        virtual ~ExampleSubWindow();

    protected:
        void on_button3_clicked();

        Gtk::Box s_VBox;
        Gtk::ButtonBox s_ButtonBox3;
        Gtk::Button s_Button3;
;

#endif //GTKMM_EXAMPLEWINDOW_H

examplewindow.cpp:

#include "examplewindow.h"
#include <iostream>

ExampleWindow::ExampleWindow()
: m_VBox(Gtk::ORIENTATION_VERTICAL),
  m_Label("The AboutDialog is non-modal. "
    "You can select parts of this text while the AboutDialog is shown."),
  m_ButtonBox(Gtk::ORIENTATION_VERTICAL),
  m_ButtonBox2(Gtk::ORIENTATION_VERTICAL),
  m_Button("Show AboutDialog"),
  m_Button2("Show SubWindow")

  set_title("Gtk::AboutDialog example");

  add(m_VBox);

  m_VBox.pack_start(m_Label);
  m_Label.set_line_wrap(true);
  m_Label.set_selectable(true);

  m_VBox.pack_start(m_ButtonBox);
  m_ButtonBox.pack_start(m_Button);
  m_Button.signal_clicked().connect(sigc::mem_fun(*this,
              &ExampleWindow::on_button_clicked) );

    m_VBox.pack_start(m_ButtonBox2);
    m_ButtonBox2.pack_start(m_Button2);
    m_Button2.signal_clicked().connect(sigc::mem_fun(*this,         &ExampleWindow::on_button2_clicked));

  m_Dialog.set_transient_for(*this);

  m_Dialog.set_program_name("Example application");
  m_Dialog.set_version("1.0.0");
  m_Dialog.set_copyright("Murray Cumming");
  m_Dialog.set_comments("This is just an example application.");
  m_Dialog.set_license("LGPL");

  m_Dialog.set_website("http://www.gtkmm.org");
  m_Dialog.set_website_label("gtkmm website");

  std::vector<Glib::ustring> list_authors;
  list_authors.push_back("Murray Cumming");
  list_authors.push_back("Somebody Else");
  list_authors.push_back("AN Other");
  m_Dialog.set_authors(list_authors);

  m_Dialog.signal_response().connect(
    sigc::mem_fun(*this, &ExampleWindow::on_about_dialog_response) );

  show_all_children();

  // The widget must be realized and mapped before grab_focus() is called.
  // That's why it's called after show_all_children().
  m_Button.grab_focus();


ExampleWindow::~ExampleWindow()




void ExampleWindow::on_about_dialog_response(int response_id)

  std::cout << response_id
    << ", close=" << Gtk::RESPONSE_CLOSE
    << ", cancel=" << Gtk::RESPONSE_CANCEL
    << ", delete_event=" << Gtk::RESPONSE_DELETE_EVENT
    << std::endl;

  if((response_id == Gtk::RESPONSE_CLOSE) ||
     (response_id == Gtk::RESPONSE_CANCEL) )
  
    m_Dialog.hide();
  


void ExampleWindow::on_button_clicked()

  m_Dialog.show();

  //Bring it to the front, in case it was already shown:
  m_Dialog.present();


void ExampleWindow::on_button2_clicked()

    ExampleSubWindow subWindow;
    subWindow.show();

子窗口.cpp

#include "examplewindow.h"
#include <iostream>

ExampleSubWindow::ExampleSubWindow()
: s_VBox(Gtk::ORIENTATION_VERTICAL),
    s_ButtonBox3(Gtk::ORIENTATION_VERTICAL),
    s_Button3("Test activation")

    add(s_VBox);

    s_VBox.pack_start(s_ButtonBox3);

    s_ButtonBox3.pack_start(s_Button3);

    s_Button3.signal_clicked().connect(sigc::mem_fun(*this,
              &ExampleSubWindow::on_button3_clicked) );


void ExampleSubWindow::on_button3_clicked()

    std::cout << "Working yet?" << std::endl;

编辑:没关系,我发现我的小项目出了什么问题。仍然不知道这个例子有什么问题,但对我来说主要的是子窗口需要用“new”创建,否则它会被立即删除。

ExampleSubWindow *subWindow = new ExampleSubWindow();

【问题讨论】:

【参考方案1】:

没关系,我发现我的小项目出了什么问题。仍然不知道示例有什么问题,但对我来说主要是需要用“new”创建子窗口,否则它将被立即删除。

ExampleSubWindow *subWindow = new ExampleSubWindow();

【讨论】:

是的。当然,您需要在某个时候将其删除。像其他小部件一样将其作为成员变量可能是最简单的。【参考方案2】:

我认为这是 Glade 中的一个错误。 Glade 中的 Gtk::Dialog 有一个子 Gtk::Box,而后者又具有子 Gtk::ButtonBox。如果将 Gtk::Button 添加到 ButtonBox,它们允许启用和设置响应 ID。如果您以任何其他方式将 Gtk::Button 添加到 Box(直接或间接地,例如通过将 Gtk::Grid 添加到 Box,然后将 Buttons 添加到该 Grid),Glade 将不允许您启用响应 ID 或设置值。

但是,如果您在 XML 中执行此操作,它会按预期运行。例如,我在 ButtonBox 中添加了一个 Button,并设置了它的 Response ID。我还在对话框中添加了一个网格,然后在该网格中添加了按钮(并且如前所述,无法启用响应 ID)。我保存了 .glade 文件,然后使用文本编辑器对其进行了编辑。我转到对话框的“action-widgets”属性,并添加了代表我添加到网格中的按钮的“action-widget”子项。这个对话框工作正常:(1)单击 ButtonBox 中的按钮按预期工作,(2)单击 Grid 中的按钮也按预期工作(对话框发出“响应”信号,响应 ID我在 .glade 文件中手动设置是从 Dialog.run()) 返回的。

【讨论】:

以上是关于Glade 对话框按钮响应 ID 灰显的主要内容,如果未能解决你的问题,请参考以下文章

MFC 对话框编辑器中的最小化/最大化框灰显

在MFC中,我去掉最大化和最小化了,当我想让它们仍然显示出来(灰显)只是不可用

MFC对话框的按钮控件消息函数不起作用

MFC对话框中如何响应弹出式菜单事件 点击按钮 弹出菜单 菜单消息事件响应不了

Go语言图形界面开发:Go版GTK

Go语言图形界面开发:Go版GTK