|
楼主 |
发表于 2004-3-17 20:11:11
|
显示全部楼层
第六章 各种构件
标签
标签主要用来作为窗口中不可编辑文本, 比如, 输入框构件旁边的标题. 你可以在构造函数中指明文本, 或者使用 set_text() 方法.
标签的宽度会被自动调整. 你可以在标签文本中加入换行符("\n"), 这样就会创建一个多行的标签.
可以使用 set_justify() 方法来调整标签文本. 这各构件还可以设置单词环绕 - 使用 set_line_wrap() 可以达到这个效果.
todo:gtkmm:标记
参考资料
示例
下面的例子将演示这些功能. 为了能更好地示范出标签的样式, 这个例子还将使用框架构件. (框架构件将在 框架 这一章介绍)
图示 6.1 标签
[图片]
源代码
文件: examplewindow.h
[PHP]
#ifndef gtkmm_examplewindow_h
#define gtkmm_examplewindow_h
#include <gtkmm.h>
class ExampleWindow : public Gtk::Window
{
public:
ExampleWindow();
virtual ~ExampleWindow();
protected:
// 子构件
Gtk::HBox m_HBox;
Gtk::VBox m_VBox, m_VBox2;
Gtk::Frame m_Frame_Normal, m_Frame_Multi, m_Frame_Left, m_Frame_Right,
m_Frame_LineWrapped, m_Frame_FilledWrapped, m_Frame_Underlined;
Gtk:abel m_Label_Normal, m_Label_Multi, m_Label_Left, m_Label_Right,
m_Label_LineWrapped, m_Label_FilledWrapped, m_Label_Underlined;
};
#endif //GTKMM_EXAMPLEWINDOW_H
[/PHP]
文件: examplewindow.cc
[PHP]
#include "examplewindow.h"
#include <iostream>
ExampleWindow::ExampleWindow()
:
m_HBox(false, 5),
m_VBox(false, 5),
m_Frame_Normal("Normal Label"),
m_Frame_Multi("Multi-line Label"),
m_Frame_Left("Left Justified Label"),
m_Frame_Right("Right Justified Label"),
m_Frame_LineWrapped("Line wrapped label"),
m_Frame_FilledWrapped("Filled, wrapped label"),
m_Frame_Underlined("Underlined label"),
m_Label_Normal("_This is a Normal label", true),
m_Label_Multi("This is a Multi-line label.\nSecond line\nThird line"),
m_Label_Left("This is a Left-Justified\nMulti-line label.\nThird line"),
m_Label_Right("This is a Right-Justified\nMulti-line label.\nFourth line, (j/k)"),
m_Label_Underlined("This label is underlined!\nThis one is underlined in quite a funky fashion")
{
set_title("Label");
set_border_width(5);
add(m_HBox);
m_HBox.pack_start(m_VBox, Gtk:ACK_SHRINK);
m_Frame_Normal.add(m_Label_Normal);
m_VBox.pack_start(m_Frame_Normal, Gtk:ACK_SHRINK);
m_Frame_Multi.add(m_Label_Multi);
m_VBox.pack_start(m_Frame_Multi, Gtk:ACK_SHRINK);
m_Label_Left.set_justify(Gtk::JUSTIFY_LEFT);
m_Frame_Left.add(m_Label_Left);
m_VBox.pack_start(m_Frame_Left, Gtk:ACK_SHRINK);
m_Label_Right.set_justify(Gtk::JUSTIFY_LEFT);
m_Frame_Right.add(m_Label_Right);
m_VBox.pack_start(m_Frame_Right, Gtk:ACK_SHRINK);
m_HBox.pack_start(m_VBox2, Gtk:ACK_SHRINK);
m_Label_LineWrapped.set_text("This is an example of a line-wrapped label. It " \
"should not be taking up the entire " /* big space to test spacing */\
"width allocated to it, but automatically " \
"wraps the words to fit. " \
"The time has come, for all good men, to come to " \
"the aid of their party. " \
"The sixth sheik's six sheep's sick.\n" \
" It supports multiple paragraphs correctly, " \
"and correctly adds "\
"many extra spaces. ");
m_Label_LineWrapped.set_line_wrap();
m_Frame_LineWrapped.add(m_Label_LineWrapped);
m_VBox2.pack_start(m_Frame_LineWrapped, Gtk:ACK_SHRINK);
m_Label_FilledWrapped.set_text("This is an example of a line-wrapped, filled label. " \
"It should be taking " \
"up the entire width allocated to it. " \
"Here is a sentence to prove "\
"my point. Here is another sentence. "\
"Here comes the sun, do de do de do.\n"\
" This is a new paragraph.\n"\
" This is another newer, longer, better " \
"paragraph. It is coming to an end, "\
"unfortunately.");
m_Label_FilledWrapped.set_justify(Gtk::JUSTIFY_FILL);
m_Label_FilledWrapped.set_line_wrap();
m_Frame_FilledWrapped.add(m_Label_FilledWrapped);
m_VBox2.pack_start(m_Frame_FilledWrapped, Gtk:ACK_SHRINK);
m_Label_Underlined.set_justify(Gtk::JUSTIFY_LEFT);
m_Label_Underlined.set_pattern ("_________________________ _ _________ _ ______ __ _______ ___");
m_Frame_Underlined.add(m_Label_Underlined);
m_VBox2.pack_start(m_Frame_Underlined, Gtk:ACK_SHRINK);
show_all_children();
}
ExampleWindow::~ExampleWindow()
{
}
[/PHP]
文件: main.cc
[PHP]
#include <gtkmm/main.h>
#include "examplewindow.h"
int main(int argc, char *argv[])
{
Gtk::Main kit(argc, argv);
ExampleWindow window;
Gtk::Main::run(window); // 显示窗口. 直到关闭窗口才返回.
return 0;
}
[/PHP]
输入框
输入框构件允许用户输入文本(不可思议地足够了)
你可以使用 set_text() 方法来改变内容, 也可以使用 get_text() 来得到当前的内容.
有时候你想让输入框构件是只读的. 可以向 set_ediable() 方法传递一个 false 参数以达到这个目的.
输入框被用来输入密码时, 人们不希望密码和其它的一些信息显示在屏幕上. 使用 false 参数来调用 set_visibility(), 文本就会被隐藏.
你可能想在用户输入文本的时候得到通知. 为了达到这个目的, Gtk::Entry 提供了两种信号, activate 和 changed. 当用户在文本输入框构件内输入回车时, 发送 activate 信号, 当用户改变了构件中的内容时, 发送 changed 信号. 举个例子, 你可以使用这些信号来验证用户输入的文本是否符合你的要求.
参考
示例
这里是一个使用 Gtk::Entry 的例子. 除了 Gtk::Entry 构件外, 还有两个复选框, 作为可编辑和可见两个选项的开关.
图片 6.2. 输入框
源代码
下拉列表框
下拉列表是文本输入框和弹出菜单的组合体. 单击菜单项上的任意一项将使它变成一个输入盒. 在其它方面, 输入盒用起来和输入框构件完全一样.
一个 Gtk::combo 包含一个 Gtk::Entry 构件, 该 Gtk::Entry 被用来实现输入盒. 你可以使用 get_entry() 方法来得到该 Gtk::Entry.
要设定弹出菜单里的值, 使用:
void Gtk::Combo::set_popdown_strings(const Gtk::SArray& strings);
这里的 strings 是你希望出现在下拉列表框中的字符串列表. 就像在基础这一章中说过的, Gtk::SArray 是一个转换器对象, 可以用来替换任何一种 STL 数组容器. 这意味着你可以向这个方法传送 vector 或 list, 这些容器将工作得和你想像地一样好. 比如, 下面这些例子是合法的:
list<string> gl;
gl.push_back("String 1");
gl.push_back("String 2");
gl.push_back("String 3");
gl.push_back("String 4");
combo.set_popdown_strings(gl);
TODO:STL-style access.
参考
示例
图片 6.3. 下拉列表框
[图片]
源代码
文件: examplewindow.h
[PHP]
#ifndef GTKMM_EXAMPLEWINDOW_H
#define GTKMM_EXAMPLEWINDOW_H
#include <gtkmm/window.h>
#include <gtkmm/combo.h>
class ExampleWindow : public Gtk::Window
{
public:
ExampleWindow();
virtual ~ExampleWindow();
protected:
//信号处理函数
virtual void on_combo_changed();
//子构件
Gtk::Combo m_Combo;
};
#endif //GTKMM_EXAMPLEWINDOW_H
[/PHP]
文件: examplewindow.cc
[PHP]
#include "examplewindow.h"
#include <gtkmm/stock.h>
#include <iostream>
ExampleWindow::ExampleWindow()
{
set_title("combo example");
//填充下拉列表
std::list<Glib::ustring> listStrings;
listStrings.push_back("something");
listStrings.push_back("something else");
listStrings.push_back("something or other");
m_Combo.set_popdown_strings(listStrings);
//创建一个复合的输入框, 使用 ComboDropDown 的高级接口把它加入下拉列表框中.
Gtk::ComboDropDownItem* item = Gtk::manage(new Gtk::ComboDropDownItem);
Gtk::HBox* hbox = Gtk::manage(new Gtk::HBox(false, 3));
hbox->pack_start(*Gtk::manage(new Gtk::Image(Gtk::Stock::CLEAR, Gtk::ICON_SIZE_MENU)), Gtk:ACK_SHRINK);
hbox->pack_start(*Gtk::manage(new Gtk:abel("some image - cool!")), Gtk::PACK_SHRINK);
item->add(*hbox);
item->show_all();
m_Combo.get_list()->children().push_back(*item);
m_Combo.set_item_string(*item, "you selected the image!");
//限制只能朋这些选项
m_Combo.set_value_in_list();
add(m_Combo);
//连接到信号处理函数
m_Combo.get_entry()->signal_changed().connect( sigc::mem_fun(*this, &ExampleWindow:n_combo_changed) );
show_all_children();
}
ExampleWindow::~ExampleWindow()
{
}
void ExampleWindow:n_combo_changed()
{
Gtk::Entry* pEntry = m_Combo.get_entry();
if(pEntry)
{
Glib::ustring text = pEntry->get_text();
if(!(text.empty())) //我们将得到两种信号, 一种当文本为空时
std::cout << "Combo changed: " << text << std::endl;
}
}
[/PHP]
文件: main.cc
[PHP]
#include <gtkmm/main.h>
#include "examplewindow.h"
int main(int argc, char *argv[])
{
Gtk::Main kit(argc, argv);
ExampleWindow window;
Gtk::Main::run(window); //显示窗口, 窗口被关闭时返回
return 0;
}
[/PHP]
旋钮
旋钮允许用户从一组值中选择一个数值. 它包含一个输入框构件和旁边的箭头按钮. 按下按钮时, 框中的值会在可能值的范围内旋动. 也可以向输入框构件中直接输入一个值.
这个值可以调整到小数位, 步长也是可调的. 旋钮还有一个 '自动-重复" 特性: 按下其中的一个箭头, 时间越久, 值变化就越快, 而且没有任何限制.
旋钮使用 Adjustment(调整) 对象控制值的范围信息. 它将使用 Adjustment 的这些属性:
value: 旋钮的值
lower: 值的下限
upper: 值的上限
step_increment: 按下左键时, 增长/减少的值
page_increment: 按下右键时, 增长/减少的值
page_size: 未使用
另外, 鼠标滚轮可被用来直接跳到上一个或下一个值.
旋钮可以创建一个缺省的 Adjustment 对象, 你可以使用 get_adjustment() 方法访问它, 你也可以在构造函数中指定一个特定的 Adjustment 对象.
方法
小数位上的值可以用 set_digits() 设定.
你可以使用 set_value() 方法设定旋钮的值, 也可以用 get_value() 来取得这个值.
调用 spin() 方法将'旋动'旋钮, 就像它的一个箭头被按下一样. 你需要设定一个 Gtk::SpinType 来设置旋动的方向.
向 set_numeric() 方法传送一个 true 参数, 可以防止用户在输入盒中输入非数值的文本.
使用 set_wrap() 方法, 可以使旋钮在上限值和下限值间旋绕.
使用 set_snap_to_ticks 方法, 可以使它吸附到最近的一个 step_increment 位置上.
你可以使用 Gtk::UPDATE_ALWAYS 或 Gtk::UPDATE_IF_VALID 调用 set_update_policy 方法来调整更新策略. 使用 Gtk::UPDATE_ALWAYS 时, 旋钮将忽略由文本转换成数字过程中遇到的错误. 这个设定还允许旋钮接受非数字的值. 你可以调用 update() 方法强制更新.
参考
示例
这是一个使用中的旋钮:
图片 6.4. 旋钮
[图片]
源代码
文件: examplewindow.h
[PHP]
#ifndef GTKMM_EXAMPLEWINDOW_H
#define GTKMM_EXAMPLEWINDOW_H
#include <gtkmm.h>
class ExampleWindow : public Gtk::Window
{
public:
ExampleWindow();
virtual ~ExampleWindow();
protected:
//信号处理函数
virtual void on_checkbutton_snap();
virtual void on_checkbutton_numeric();
virtual void on_spinbutton_digits_changed();
virtual void on_button_close();
enum enumValueFormats
{
VALUE_FORMAT_INT,
VALUE_FORMAT_FLOAT
};
virtual void on_button_getvalue(enumValueFormats display);
//子构件
Gtk::Frame m_Frame_NotAccelerated, m_Frame_Accelerated;
Gtk::HBox m_HBox_NotAccelerated, m_HBox_Accelerated,
m_HBox_Buttons;
Gtk::VBox m_VBox_Main, m_VBox, m_VBox_Day, m_VBox_Month, m_VBox_Year,
m_VBox_Accelerated, m_VBox_Value, m_VBox_Digits;
Gtk:abel m_Label_Day, m_Label_Month, m_Label_Year,
m_Label_Value, m_Label_Digits,
m_Label_ShowValue;
Gtk::Adjustment m_adjustment_day, m_adjustment_month, m_adjustment_year,
m_adjustment_value, m_adjustment_digits;
Gtk::SpinButton m_SpinButton_Day, m_SpinButton_Month, m_SpinButton_Year,
m_SpinButton_Value, m_SpinButton_Digits;
Gtk::CheckButton m_CheckButton_Snap, m_CheckButton_Numeric;
Gtk::Button m_Button_Int, m_Button_Float, m_Button_Close;
};
#endif //GTKMM_EXAMPLEWINDOW_H
[/PHP]
文件: examplewindow.cc
[PHP]
#include "examplewindow.h"
#include <iostream>
#include <stdio.h>
ExampleWindow::ExampleWindow()
:
m_Frame_NotAccelerated("Not accelerated"),
m_Frame_Accelerated("Accelerated"),
m_VBox_Main(false, 5),
m_Label_Day("Day: "), m_Label_Month("Month: "), m_Label_Year("Year: "),
m_Label_Value("Value: "),
m_Label_Digits("Digits: "),
m_adjustment_day(1.0, 1.0, 31.0, 1.0, 5.0, 0.0),
m_adjustment_month(1.0, 1.0, 12.0, 1.0, 5.0, 0.0),
m_adjustment_year(1998.0, 0.0, 2100.0, 1.0, 100.0, 0.0),
m_adjustment_value(0.0, -10000.0, 10000.0, 0.5, 100.0, 0.0),
m_adjustment_digits(2.0, 1.0, 5.0, 1.0, 1.0, 0.0),
m_SpinButton_Day(m_adjustment_day),
m_SpinButton_Month(m_adjustment_month),
m_SpinButton_Year(m_adjustment_year),
m_SpinButton_Value(m_adjustment_value, 1.0, 2),
m_SpinButton_Digits(m_adjustment_digits),
m_CheckButton_Snap("Snap to 0.5-ticks"),
m_CheckButton_Numeric("Numeric only input mode"),
m_Button_Int("Value as Int"),
m_Button_Float("Value as Float"),
m_Button_Close("Close")
{
set_title("SpinButton");
m_VBox_Main.set_border_width(10);
add(m_VBox_Main);
m_VBox_Main.pack_start(m_Frame_NotAccelerated);
m_VBox.set_border_width(5);
m_Frame_NotAccelerated.add(m_VBox);
/* 日, 月, 年 旋钮 */
m_VBox.pack_start(m_HBox_NotAccelerated, Gtk::PACK_EXPAND_WIDGET, 5);
m_Label_Day.set_alignment(Gtk::ALIGN_LEFT);
m_VBox_Day.pack_start(m_Label_Day);
m_SpinButton_Day.set_wrap();
m_VBox_Day.pack_start(m_SpinButton_Day);
m_HBox_NotAccelerated.pack_start(m_VBox_Day, Gtk::PACK_EXPAND_WIDGET, 5);
m_Label_Month.set_alignment(Gtk::ALIGN_LEFT);
m_VBox_Month.pack_start(m_Label_Month);
m_SpinButton_Month.set_wrap();
m_VBox_Month.pack_start(m_SpinButton_Month);
m_HBox_NotAccelerated.pack_start(m_VBox_Month, Gtk::PACK_EXPAND_WIDGET, 5);
m_Label_Year.set_alignment(Gtk::ALIGN_LEFT);
m_VBox_Year.pack_start(m_Label_Year);
m_SpinButton_Year.set_wrap();
m_SpinButton_Year.set_size_request(55, -1);
m_VBox_Year.pack_start(m_SpinButton_Year);
m_HBox_NotAccelerated.pack_start(m_VBox_Year, Gtk::PACK_EXPAND_WIDGET, 5);
//加速
m_VBox_Main.pack_start(m_Frame_Accelerated);
m_VBox_Accelerated.set_border_width(5);
m_Frame_Accelerated.add(m_VBox_Accelerated);
m_VBox_Accelerated.pack_start(m_HBox_Accelerated, Gtk::PACK_EXPAND_WIDGET, 5);
m_HBox_Accelerated.pack_start(m_VBox_Value, Gtk::PACK_EXPAND_WIDGET, 5);
m_Label_Value.set_alignment(Gtk::ALIGN_LEFT);
m_VBox_Value.pack_start(m_Label_Value);
m_SpinButton_Value.set_wrap();
m_SpinButton_Value.set_size_request(100, -1);
m_VBox_Value.pack_start(m_SpinButton_Value);
m_HBox_Accelerated.pack_start(m_VBox_Digits, Gtk::PACK_EXPAND_WIDGET, 5);
m_Label_Digits.set_alignment(Gtk::ALIGN_LEFT);
m_VBox_Digits.pack_start(m_Label_Digits);
m_SpinButton_Digits.set_wrap();
m_adjustment_digits.signal_value_changed().connect( sigc::mem_fun(*this, &ExampleWindow:n_spinbutton_digits_changed) );
m_VBox_Digits.pack_start(m_SpinButton_Digits);
//复选框:
m_VBox_Accelerated.pack_start(m_CheckButton_Snap);
m_CheckButton_Snap.set_active();
m_CheckButton_Snap.signal_clicked().connect( sigc::mem_fun(*this, &ExampleWindow:n_checkbutton_snap) );
m_VBox_Accelerated.pack_start(m_CheckButton_Numeric);
m_CheckButton_Numeric.set_active();
m_CheckButton_Numeric.signal_clicked().connect( sigc::mem_fun(*this, &ExampleWindow:n_checkbutton_numeric) );
//按钮:
m_VBox_Accelerated.pack_start (m_HBox_Buttons, Gtk::PACK_SHRINK, 5);
m_Button_Int.signal_clicked().connect( sigc::bind( sigc::mem_fun(*this, &ExampleWindow:n_button_getvalue), VALUE_FORMAT_INT) );
m_HBox_Buttons.pack_start(m_Button_Int, Gtk::PACK_EXPAND_WIDGET, 5);
m_Button_Float.signal_clicked().connect( sigc::bind( sigc::mem_fun(*this, &ExampleWindow:n_button_getvalue), VALUE_FORMAT_FLOAT) );
m_HBox_Buttons.pack_start(m_Button_Float, Gtk::PACK_EXPAND_WIDGET, 5);
m_VBox_Accelerated.pack_start(m_Label_ShowValue);
m_Label_ShowValue.set_text("0");
//关闭按钮:
m_Button_Close.signal_clicked().connect( sigc::mem_fun(*this, &ExampleWindow:n_button_close) );
m_VBox_Main.pack_start(m_Button_Close, Gtk::PACK_SHRINK);
show_all_children();
}
ExampleWindow::~ExampleWindow()
{
}
void ExampleWindow:n_button_close()
{
hide();
}
void ExampleWindow:n_checkbutton_snap()
{
m_SpinButton_Value.set_snap_to_ticks( m_CheckButton_Snap.get_active() );
}
void ExampleWindow::on_checkbutton_numeric()
{
m_SpinButton_Value.set_numeric( m_CheckButton_Numeric.get_active() );
}
void ExampleWindow::on_spinbutton_digits_changed()
{
m_SpinButton_Value.set_digits( m_SpinButton_Digits.get_value_as_int() );
}
void ExampleWindow::on_button_getvalue(enumValueFormats display)
{
gchar buf[32];
if (display == VALUE_FORMAT_INT)
sprintf (buf, "%d", m_SpinButton_Value.get_value_as_int());
else
sprintf (buf, "%0.*f", m_SpinButton_Value.get_digits(), m_SpinButton_Value.get_value());
m_Label_ShowValue.set_text(buf);
}
[/PHP]
文件: main.cc
[PHP]
#include <gtkmm/main.h>
#include "examplewindow.h"
int main(int argc, char *argv[])
{
Gtk::Main kit(argc, argv);
ExampleWindow window;
Gtk::Main::run(window); //显示窗口, 关闭时返回.
return 0;
}
[/PHP]
进度条
进度条用来显示进行中操作的状态. 比如, 进度条可以用来显示一项工作完成了多少.
使用一个位于 0 到 1 之间的 double 型参数, 调用 set_fraction() 方法可以调整进度显示值.
percentage 是位于 0 到 1 之间的一个值, 指明进度条有多少部分被填充.
缺省情况下, 进度条是水平方向, 从左往右的, 但是你也可以用 set_orientation() 方法来设置一个垂直的进度条.
参考
活动模式
除了指定进度量以外, 进度条还可以用来指定当前是否正在活动; 把进度条设置成活动模式就可以达到这种效果. 在这种模式下, 进度条显示一下飞来飞去的矩形. 当一个操作的进度很难用数值表示时(比如, 接收一个不明大小的文件), 活动模式相关管用.
要达到这种效果, 你得定时地调用 pulse() 方法. 你还可以使用 set_pulse_step() 选择进度大小.
在连续模式下时, 还可以使用 set_test() 方法在进度条的槽内显示一个可定制的字符串.
示例
图片 6.5. 进度条
[图片]
源代码
文件: examplewindow.h
[PHP]
#ifndef GTKMM_EXAMPLEWINDOW_H
#define GTKMM_EXAMPLEWINDOW_H
#include <gtkmm.h>
class ExampleWindow : public Gtk::Window
{
public:
ExampleWindow();
virtual ~ExampleWindow();
protected:
//信号处理函数
virtual void on_checkbutton_text();
virtual void on_checkbutton_activity();
virtual void on_checkbutton_orientation();
virtual bool on_timeout();
virtual void on_button_close();
//子构件
Gtk::VBox m_VBox;
Gtk::Alignment m_Alignment;
Gtk::Table m_Table;
Gtk::ProgressBar m_ProgressBar;
Gtk::HSeparator m_Separator;
Gtk::CheckButton m_CheckButton_Text, m_CheckButton_Activity, m_CheckButton_Orientation;
Gtk::Button m_Button_Close;
int m_connection_id_timeout;
bool m_bActivityMode;
};
#endif //GTKMM_EXAMPLEWINDOW_H
[/PHP]
File: examplewindow.cc
[PHP]
#include "examplewindow.h"
#include <iostream>
ExampleWindow::ExampleWindow()
: m_VBox(false, 5),
m_Alignment(0.5, 0.5, 0, 0),
m_Table(2, 2, true),
m_CheckButton_Text("Show text"),
m_CheckButton_Activity("Activity mode"),
m_CheckButton_Orientation("Right to Left"),
m_Button_Close("Close"),
m_bActivityMode(false)
{
set_resizable();
set_title("Gtk::ProgressBar");
m_VBox.set_border_width(10);
add(m_VBox);
m_VBox.pack_start(m_Alignment, Gtk::PACK_SHRINK, 5);
m_Alignment.add(m_ProgressBar);
//添加一个时间回调函数, 用来更新进度值
m_connection_id_timeout = Glib::signal_timeout().connect( sigc::mem_fun(*this, &ExampleWindow::on_timeout), 50 );
m_VBox.pack_start(m_Separator, Gtk::PACK_SHRINK);
m_VBox.pack_start(m_Table);
//添加一个复选框, 用来选择显示在槽内的字符串
m_Table.attach(m_CheckButton_Text, 0, 1, 0, 1, Gtk::EXPAND | Gtk::FILL, Gtk::EXPAND | Gtk::FILL, 5, 5);
m_CheckButton_Text.signal_clicked().connect( sigc::mem_fun(*this, &ExampleWindow::on_checkbutton_text) );
//添加一个复选框, 用来选择显示在槽内的字符串
m_Table.attach(m_CheckButton_Activity, 0, 1, 1, 2, Gtk::EXPAND | Gtk::FILL, Gtk::EXPAND | Gtk::FILL, 5, 5);
m_CheckButton_Activity.signal_clicked().connect( sigc::mem_fun(*this, &ExampleWindow::on_checkbutton_activity) );
//添加一个复选框, 作为活动模式的开关
m_Table.attach(m_CheckButton_Orientation, 0, 1, 2, 3, Gtk::EXPAND | Gtk::FILL, Gtk::EXPAND | Gtk::FILL, 5, 5);
m_CheckButton_Orientation.signal_clicked().connect( sigc::mem_fun(*this, &ExampleWindow::on_checkbutton_orientation) );
//添加一个按钮, 用来退出程序
m_VBox.pack_start(m_Button_Close, Gtk::PACK_SHRINK);
m_Button_Close.signal_clicked().connect( sigc::mem_fun(*this, &ExampleWindow::on_button_close) );
m_Button_Close.set_flags(Gtk::CAN_DEFAULT);
m_Button_Close.grab_default();
show_all_children();
}
ExampleWindow::~ExampleWindow()
{
}
void ExampleWindow::on_checkbutton_text()
{
const Glib::ustring text = m_ProgressBar.get_text();
if(!text.empty())
m_ProgressBar.set_text("");
else
m_ProgressBar.set_text("some text");
}
void ExampleWindow::on_checkbutton_activity()
{
m_bActivityMode = m_CheckButton_Activity.get_active();
if(m_bActivityMode)
m_ProgressBar.pulse();
else
m_ProgressBar.set_fraction(0.0);
}
void ExampleWindow::on_checkbutton_orientation()
{
switch(m_ProgressBar.get_orientation())
{
case Gtk::PROGRESS_LEFT_TO_RIGHT:
m_ProgressBar.set_orientation(Gtk::PROGRESS_RIGHT_TO_LEFT);
break;
case Gtk::PROGRESS_RIGHT_TO_LEFT:
m_ProgressBar.set_orientation(Gtk::PROGRESS_LEFT_TO_RIGHT);
break;
default:
break; // 什么也不做
}
}
void ExampleWindow::on_button_close()
{
hide();
}
/* 设置进度条的值, 所以我们可以看到
* 活动状态 */
bool ExampleWindow::on_timeout()
{
if(m_bActivityMode)
m_ProgressBar.pulse();
else
{
double new_val = m_ProgressBar.get_fraction() + 0.01;
if(new_val > 1.0)
new_val = 0.0;
//设置新值
m_ProgressBar.set_fraction(new_val);
}
//作为一个 timeout(到时) 函数, 返回 true 将导致将被连续调用
return true;
}
[/PHP]
File: main.cc
[PHP]
#include <gtkmm/main.h>
#include "examplewindow.h"
int main(int argc, char *argv[])
{
Gtk::Main kit(argc, argv);
ExampleWindow window;
Gtk::Main::run(window); //显示窗口, 关闭时返回
return 0;
}
[/PHP]
工具提示
工具提示是一些短小的字符串, 当你把鼠标停留在构件上几秒后, 只要 Gtk::Tooltips 对象是这些工具提示的一个组, 它们就会显示出来. 在创建一个 Gtk::Tooltips 实例之后, 你可以使用 set_tip() 方法把这个描述字符串和某个构件联系起来.
你可以用 enable() 和 disable() 来打开或关闭一组工具提示.
参考 |
|