本文整理汇总了C++中GTK_SPINNER函数的典型用法代码示例。如果您正苦于以下问题:C++ GTK_SPINNER函数的具体用法?C++ GTK_SPINNER怎么用?C++ GTK_SPINNER使用的例子?那么恭喜您, 这里精选的函数代码示例或许可以为您提供帮助。
在下文中一共展示了GTK_SPINNER函数的20个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于我们的系统推荐出更棒的C++代码示例。
示例1: device_busy_cb
static void
device_busy_cb (NmaBtDevice *device, GParamSpec *pspec, WidgetInfo *info)
{
gboolean busy = nma_bt_device_get_busy (device);
if (info->pan_button)
gtk_widget_set_sensitive (info->pan_button, !busy);
if (info->dun_button)
set_dun_button_sensitive (info, !busy);
if (busy) {
if (!info->spinner) {
info->spinner = gtk_spinner_new ();
gtk_box_pack_start (GTK_BOX (info->hbox), info->spinner, FALSE, FALSE, 6);
}
gtk_spinner_start (GTK_SPINNER (info->spinner));
gtk_widget_show (info->spinner);
} else {
if (info->spinner) {
gtk_spinner_stop (GTK_SPINNER (info->spinner));
gtk_widget_destroy (info->spinner);
info->spinner = NULL;
}
}
}
开发者ID:pavlix,项目名称:nm-applet,代码行数:25,代码来源:bt-widget.c
示例2: nautilus_notebook_sync_loading
void
nautilus_notebook_sync_loading (NautilusNotebook *notebook,
NautilusWindowSlot *slot)
{
GtkWidget *tab_label, *spinner, *icon;
gboolean active;
g_return_if_fail (NAUTILUS_IS_NOTEBOOK (notebook));
g_return_if_fail (NAUTILUS_IS_WINDOW_SLOT (slot));
tab_label = gtk_notebook_get_tab_label (GTK_NOTEBOOK (notebook),
GTK_WIDGET (slot));
g_return_if_fail (GTK_IS_WIDGET (tab_label));
spinner = GTK_WIDGET (g_object_get_data (G_OBJECT (tab_label), "spinner"));
icon = GTK_WIDGET (g_object_get_data (G_OBJECT (tab_label), "icon"));
g_return_if_fail (spinner != NULL && icon != NULL);
active = FALSE;
g_object_get (spinner, "active", &active, NULL);
if (active == slot->allow_stop) {
return;
}
if (slot->allow_stop) {
gtk_widget_hide (icon);
gtk_widget_show (spinner);
gtk_spinner_start (GTK_SPINNER (spinner));
} else {
gtk_spinner_stop (GTK_SPINNER (spinner));
gtk_widget_hide (spinner);
gtk_widget_show (icon);
}
}
开发者ID:hb,项目名称:nautilus,代码行数:34,代码来源:nautilus-notebook.c
示例3: toggle_spin
static void
toggle_spin (GtkWidget *checkbutton,
GtkWidget *spinner)
{
if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(checkbutton)))
gtk_spinner_start (GTK_SPINNER (spinner));
else
gtk_spinner_stop (GTK_SPINNER (spinner));
}
开发者ID:3v1n0,项目名称:gtk,代码行数:9,代码来源:gdkgears.c
示例4: gtk_range_get_value
// Обработчик нажатия кнопки Конвертировать.
void cMainWin::OnConvert(GtkWidget *widget, cMainWin *aMainWin)
{
// Проверим есть ли вообще что конвертировать.
if(aMainWin->mTracks.empty())
{
aMainWin->PrintNotification("Не выбрано ни одного трека для конвертации.", eNotifTypeError);
return;
}
// Проверим создан ли экземпляр конвертера в окне.
if(!aMainWin->mConvert)
{
aMainWin->PrintNotification("Ошибка конвертера. Перезапустите приложение.", eNotifTypeError);
return;
}
// Получим из комбо бокса формат файла в который будем конвертировать все аудио файлы.
aMainWin->mConvert->SetFormat(gtk_combo_box_text_get_active_text ((GtkComboBoxText *)aMainWin->mwFormat));
// Для разных форматов необходимо получить параметры конвертации.
// Например, получим качество файлов на выходе.
if(aMainWin->mConvert->GetFormat() == eFormat_MP3)
{
int adQualityMark = gtk_range_get_value ((GtkRange *)aMainWin->mMP3Widgets.mwQuality);
aMainWin->mConvert->SetQuality(asMP3Quality[adQualityMark]);
}
else if(aMainWin->mConvert->GetFormat() == eFormat_OGG)
{
int adQualityMark = gtk_range_get_value ((GtkRange *)aMainWin->mOGGWidgets.mwQuality);
aMainWin->mConvert->SetQuality(asOGGQuality[adQualityMark]);
}
else if(aMainWin->mConvert->GetFormat() == eFormat_WAV)
{
}
// Теперь-то покажем спиннер и запустим его.
gtk_widget_show(aMainWin->mwSpinner);
gtk_spinner_start (GTK_SPINNER (aMainWin->mwSpinner));
// Основная функция конвертации файлов.
if(!aMainWin->mConvert->Convert())
{
gtk_spinner_stop (GTK_SPINNER (aMainWin->mwSpinner));
aMainWin->PrintNotification("Что-то пошло не так при конвертации.", eNotifTypeError);
}
else
{
gtk_spinner_stop (GTK_SPINNER (aMainWin->mwSpinner));
aMainWin->PrintNotification("Конвертация прошла успешно!", eNotifTypeNotification);
}
gtk_widget_hide(aMainWin->mwSpinner); // Спрячем спиннер до следующей конвертации.
}
开发者ID:dmitrykilchanov,项目名称:convert,代码行数:55,代码来源:MainWin.cpp
示例5: status_changed_cb
static void
status_changed_cb(MathEquation *equation, GParamSpec *spec, MathDisplay *display)
{
gtk_text_buffer_set_text(display->priv->info_buffer, math_equation_get_status(equation), -1);
if (math_equation_in_solve(equation) && !gtk_widget_get_visible(display->priv->spinner)) {
gtk_widget_show(display->priv->spinner);
gtk_spinner_start(GTK_SPINNER(display->priv->spinner));
}
else if (!math_equation_in_solve(equation) && gtk_widget_get_visible(display->priv->spinner)) {
gtk_widget_hide(display->priv->spinner);
gtk_spinner_stop(GTK_SPINNER(display->priv->spinner));
}
}
开发者ID:raveit65,项目名称:mate-calc,代码行数:13,代码来源:math-display.c
示例6: state_changed_cb
static void
state_changed_cb (GtkWidget *widget,
GParamSpec *pspec,
EmerillonWindow *self)
{
ChamplainState state;
g_object_get (self->priv->view, "state", &state, NULL);
if (state == CHAMPLAIN_STATE_LOADING)
gtk_spinner_start (GTK_SPINNER (self->priv->throbber));
else
gtk_spinner_stop (GTK_SPINNER (self->priv->throbber));
}
开发者ID:deejay1,项目名称:emerillon,代码行数:13,代码来源:window.c
示例7: request_contact_info_cb
static void
request_contact_info_cb (GObject *object,
GAsyncResult *res,
gpointer user_data)
{
TpawUserInfo *self = user_data;
TpContact *contact = TP_CONTACT (object);
guint n_rows;
GError *error = NULL;
if (!tp_contact_request_contact_info_finish (contact, res, &error))
{
/* If the request got cancelled it could mean the contact widget is
* destroyed, so we should not dereference self */
if (g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED))
{
g_clear_error (&error);
return;
}
g_clear_error (&error);
}
n_rows = fill_contact_info_grid (self);
gtk_widget_set_visible (self->priv->details_label, n_rows > 0);
gtk_spinner_stop (GTK_SPINNER (self->priv->details_spinner));
gtk_widget_hide (self->priv->details_spinner);
}
开发者ID:Distrotech,项目名称:telepathy-account-widgets,代码行数:28,代码来源:tpaw-user-info.c
示例8: nautilus_navigation_window_set_spinner_active
void
nautilus_navigation_window_set_spinner_active (NautilusNavigationWindow *window,
gboolean allow)
{
if (( window->details->spinner_active && allow) ||
(!window->details->spinner_active && !allow)) {
return;
}
window->details->spinner_active = allow;
if (allow) {
gtk_spinner_start (GTK_SPINNER (window->details->spinner));
} else {
gtk_spinner_stop (GTK_SPINNER (window->details->spinner));
}
}
开发者ID:petergtz,项目名称:nautilus,代码行数:16,代码来源:nautilus-window-toolbars.c
示例9: load_webkit_string
/*
* Display a web page from a HTML string in memory, rather than from a URL
*/
void
load_webkit_string(struct tab *t, const char *str, gchar *title)
{
char file[PATH_MAX];
int i;
/* we set this to indicate we want to manually do navaction */
if (t->bfl)
t->item = webkit_web_back_forward_list_get_current_item(t->bfl);
t->xtp_meaning = XT_XTP_TAB_MEANING_NORMAL;
if (title) {
/* set t->xtp_meaning */
for (i = 0; i < LENGTH(about_list); i++)
if (!strcmp(title, about_list[i].name)) {
t->xtp_meaning = i;
break;
}
webkit_web_view_load_string(t->wv, str, NULL, encoding,
"file://");
#if GTK_CHECK_VERSION(2, 20, 0)
gtk_spinner_stop(GTK_SPINNER(t->spinner));
gtk_widget_hide(t->spinner);
#endif
snprintf(file, sizeof file, "%s" PS "%s", resource_dir, icons[0]);
xt_icon_from_file(t, file);
}
}
开发者ID:Hary000,项目名称:xxxterm,代码行数:32,代码来源:about.c
示例10: on_import_button_clicked
static void
on_import_button_clicked (GtkButton *import_button, gpointer user_data)
{
SeahorseKeyserverResultsRow *row = user_data;
g_autoptr(GtkWidget) spinner = NULL;
g_autoptr(GList) keys = NULL;
g_autoptr(GCancellable) cancellable = NULL;
SeahorsePgpBackend *backend;
SeahorseGpgmeKeyring *keyring;
/* Let the button show a spinner while importing */
gtk_widget_set_sensitive (GTK_WIDGET (import_button), FALSE);
spinner = gtk_spinner_new ();
gtk_spinner_start (GTK_SPINNER (spinner));
gtk_button_set_image (import_button, g_steal_pointer (&spinner));
/* Now import the key */
keys = g_list_append (keys, row->key);
cancellable = g_cancellable_new ();
backend = seahorse_pgp_backend_get ();
keyring = seahorse_pgp_backend_get_default_keyring (backend);
seahorse_pgp_backend_transfer_async (backend, keys,
SEAHORSE_PLACE (keyring),
cancellable, on_import_complete,
g_object_ref (row));
}
开发者ID:GNOME,项目名称:seahorse,代码行数:26,代码来源:seahorse-keyserver-results.c
示例11: updated_database_cb
static void
updated_database_cb (gpointer data, gpointer user_data)
{
FsearchApplicationWindow *win = (FsearchApplicationWindow *) user_data;
g_assert (FSEARCH_WINDOW_IS_WINDOW (win));
hide_overlays (win);
update_statusbar (win, "");
fsearch_application_window_update_search (win);
gtk_spinner_stop (GTK_SPINNER (win->database_spinner));
gtk_stack_set_visible_child (GTK_STACK (win->database_stack), win->database_box2);
Database *db = fsearch_application_get_db (FSEARCH_APPLICATION_DEFAULT);
uint32_t num_items = db_get_num_entries (db);
gchar db_text[100] = "";
snprintf (db_text, sizeof (db_text), _("%'d Items"), num_items);
gtk_label_set_text (GTK_LABEL (win->database_label), db_text);
time_t timestamp = db_get_timestamp (db);
strftime (db_text, sizeof(db_text),
"Last Updated: %Y-%m-%d %H:%M", //"%Y-%m-%d %H:%M",
localtime (×tamp));
gtk_widget_set_tooltip_text (win->database_toggle_button, db_text);
}
开发者ID:cboxdoerfer,项目名称:fsearch,代码行数:27,代码来源:fsearch_window.c
示例12: main
int main (int argc, char *argv[])
{
GtkBuilder *builder;
tMainWindow mainWindow;
gpointer pMainWindow = &mainWindow;
gtk_init (&argc, &argv);
builder = gtk_builder_new ();
gtk_builder_add_from_file (builder, "ui.glade", NULL);
/* References to Window1 */
((tMainWindow*)pMainWindow)->window1 = GTK_WIDGET (gtk_builder_get_object (builder, "window1"));
((tMainWindow*)pMainWindow)->textview_address = GTK_TEXT_VIEW (gtk_builder_get_object (builder, "textview_address"));
((tMainWindow*)pMainWindow)->entry_subject = GTK_ENTRY (gtk_builder_get_object (builder, "entry_subject"));
((tMainWindow*)pMainWindow)->entry_opening = GTK_ENTRY (gtk_builder_get_object (builder, "entry_opening"));
((tMainWindow*)pMainWindow)->textview_letter = GTK_TEXT_VIEW (gtk_builder_get_object (builder, "textview_letter"));
((tMainWindow*)pMainWindow)->entry_enclosure = GTK_ENTRY (gtk_builder_get_object (builder, "entry_supplement"));
((tMainWindow*)pMainWindow)->spinner = GTK_SPINNER (gtk_builder_get_object (builder, "spinner"));
gtk_builder_connect_signals (builder, pMainWindow);
g_object_unref (G_OBJECT (builder));
gtk_widget_show (mainWindow.window1);
gtk_main ();
return 0;
}
开发者ID:dermirt,项目名称:tex-letter,代码行数:29,代码来源:test.c
示例13: gtk_window_new
static GtkWidget *autoenc_processing_dialog_create(void)
{
GtkWidget *dialog;
GtkWidget *hbox;
GtkWidget *spinner;
GtkWidget *label;
dialog = gtk_window_new(GTK_WINDOW_TOPLEVEL);
gtk_container_set_border_width(GTK_CONTAINER(dialog), 16);
gtk_window_set_position(GTK_WINDOW(dialog), GTK_WIN_POS_CENTER);
gtk_window_set_title(GTK_WINDOW(dialog), _("Encrypting attachments"));
gtk_window_set_modal(GTK_WINDOW(dialog), TRUE);
gtk_window_set_policy(GTK_WINDOW(dialog), FALSE, FALSE, FALSE);
syl_plugin_manage_window_set_transient(GTK_WINDOW(dialog));
//g_signal_connect(G_OBJECT(dialog), "delete_event", G_CALLBACK(gtk_true), NULL);
hbox = gtk_hbox_new(FALSE, 12);
gtk_container_add(GTK_CONTAINER(dialog), hbox);
gtk_widget_show(hbox);
spinner = gtk_spinner_new();
gtk_widget_set_size_request(spinner, 16, 16);
gtk_box_pack_start(GTK_BOX(hbox), spinner, FALSE, FALSE, 0);
gtk_widget_show(spinner);
label = gtk_label_new(_("Encrypting attachments..."));
gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0);
gtk_widget_show(label);
gtk_widget_show(dialog);
gtk_spinner_start(GTK_SPINNER(spinner));
return dialog;
}
开发者ID:y-hiroyu,项目名称:sylpheed-autoenc-plugin,代码行数:35,代码来源:autoenc.c
示例14: spd_init
/* public functions */
void spd_init(GtkBuilder *builder)
{
/* widgets and icons */
revealer_scan_progress = GTK_REVEALER(gtk_builder_get_object(builder, "revealer_scan_progress"));
lab_scan_progress = GTK_LABEL(gtk_builder_get_object(builder, "lab_scan_progress"));
scanningSpinner = GTK_SPINNER(gtk_builder_get_object(builder, "scanningSpinner"));
p_innerPaned = GTK_PANED(gtk_builder_get_object(builder, "p_innerPaned")) ;
}
开发者ID:impegoraro,项目名称:tagtool,代码行数:9,代码来源:scan_progress_dlg.c
示例15: pp_ppd_selection_dialog_new
PpPPDSelectionDialog *
pp_ppd_selection_dialog_new (GtkWindow *parent,
PPDList *ppd_list,
gchar *manufacturer,
UserResponseCallback user_callback,
gpointer user_data)
{
PpPPDSelectionDialog *dialog;
GtkWidget *widget;
GError *error = NULL;
gchar *objects[] = { "ppd-selection-dialog", NULL };
guint builder_result;
dialog = g_new0 (PpPPDSelectionDialog, 1);
dialog->builder = gtk_builder_new ();
dialog->parent = GTK_WIDGET (parent);
builder_result = gtk_builder_add_objects_from_file (dialog->builder,
DATADIR"/ppd-selection-dialog.ui",
objects, &error);
if (builder_result == 0)
{
g_warning ("Could not load ui: %s", error->message);
g_error_free (error);
return NULL;
}
dialog->dialog = (GtkWidget *) gtk_builder_get_object (dialog->builder, "ppd-selection-dialog");
dialog->user_callback = user_callback;
dialog->user_data = user_data;
dialog->response = GTK_RESPONSE_NONE;
dialog->list = ppd_list_copy (ppd_list);
dialog->manufacturer = get_standard_manufacturers_name (manufacturer);
/* connect signals */
g_signal_connect (dialog->dialog, "delete-event", G_CALLBACK (gtk_widget_hide_on_delete), NULL);
g_signal_connect (dialog->dialog, "response", G_CALLBACK (ppd_selection_dialog_response_cb), dialog);
widget = (GtkWidget*)
gtk_builder_get_object (dialog->builder, "content-alignment");
g_signal_connect (widget, "size-allocate", G_CALLBACK (update_alignment_padding), dialog);
widget = (GtkWidget*)
gtk_builder_get_object (dialog->builder, "ppd-spinner");
gtk_spinner_start (GTK_SPINNER (widget));
populate_dialog (dialog);
gtk_window_set_transient_for (GTK_WINDOW (dialog->dialog), GTK_WINDOW (parent));
gtk_window_present (GTK_WINDOW (dialog->dialog));
gtk_widget_show_all (GTK_WIDGET (dialog->dialog));
return dialog;
}
开发者ID:tigersoldier,项目名称:gnome-control-center,代码行数:58,代码来源:pp-ppd-selection-dialog.c
示例16: fill_ppds_list
static void
fill_ppds_list (PpPPDSelectionDialog *dialog)
{
GtkTreeSelection *selection;
GtkListStore *store;
GtkTreePath *path;
GtkTreeView *treeview;
GtkTreeIter iter;
GtkTreeIter *preselect_iter = NULL;
GtkWidget *widget;
gint i;
widget = (GtkWidget*)
gtk_builder_get_object (dialog->builder, "ppd-spinner");
gtk_widget_hide (widget);
gtk_spinner_stop (GTK_SPINNER (widget));
widget = (GtkWidget*)
gtk_builder_get_object (dialog->builder, "progress-label");
gtk_widget_hide (widget);
treeview = (GtkTreeView*)
gtk_builder_get_object (dialog->builder, "ppd-selection-manufacturers-treeview");
if (dialog->list)
{
store = gtk_list_store_new (2, G_TYPE_STRING, G_TYPE_STRING);
for (i = 0; i < dialog->list->num_of_manufacturers; i++)
{
gtk_list_store_append (store, &iter);
gtk_list_store_set (store, &iter,
PPD_MANUFACTURERS_NAMES_COLUMN, dialog->list->manufacturers[i]->manufacturer_name,
PPD_MANUFACTURERS_DISPLAY_NAMES_COLUMN, dialog->list->manufacturers[i]->manufacturer_display_name,
-1);
if (g_strcmp0 (dialog->manufacturer,
dialog->list->manufacturers[i]->manufacturer_display_name) == 0)
{
preselect_iter = gtk_tree_iter_copy (&iter);
}
}
gtk_tree_view_set_model (treeview, GTK_TREE_MODEL (store));
if (preselect_iter &&
(selection = gtk_tree_view_get_selection (treeview)) != NULL)
{
gtk_tree_selection_select_iter (selection, preselect_iter);
path = gtk_tree_model_get_path (GTK_TREE_MODEL (store), preselect_iter);
gtk_tree_view_scroll_to_cell (treeview, path, NULL, TRUE, 0.5, 0.0);
gtk_tree_path_free (path);
gtk_tree_iter_free (preselect_iter);
}
g_object_unref (store);
}
}
开发者ID:Amphiboly,项目名称:gnome-control-center,代码行数:58,代码来源:pp-ppd-selection-dialog.c
示例17: nemo_floating_bar_hide
static void
nemo_floating_bar_hide (GtkWidget *widget)
{
NemoFloatingBar *self = NEMO_FLOATING_BAR (widget);
GTK_WIDGET_CLASS (nemo_floating_bar_parent_class)->hide (widget);
gtk_spinner_stop (GTK_SPINNER (self->priv->spinner));
}
开发者ID:3dfxmadscientist,项目名称:nemo,代码行数:9,代码来源:nemo-floating-bar.c
示例18: new_chatroom_dialog_listing_cb
static void
new_chatroom_dialog_listing_cb (EmpathyTpRoomlist *room_list,
gpointer unused,
EmpathyNewChatroomDialog *dialog)
{
gboolean listing;
listing = empathy_tp_roomlist_is_listing (room_list);
/* Update the throbber */
if (listing) {
gtk_spinner_start (GTK_SPINNER (dialog->throbber));
gtk_widget_show (dialog->throbber);
} else {
gtk_spinner_stop (GTK_SPINNER (dialog->throbber));
gtk_widget_hide (dialog->throbber);
}
}
开发者ID:DylanMcCall,项目名称:Empathy---Hide-contact-groups,代码行数:18,代码来源:empathy-new-chatroom-dialog.c
示例19: athena_floating_bar_hide
static void
athena_floating_bar_hide (GtkWidget *widget)
{
AthenaFloatingBar *self = ATHENA_FLOATING_BAR (widget);
GTK_WIDGET_CLASS (athena_floating_bar_parent_class)->hide (widget);
gtk_spinner_stop (GTK_SPINNER (self->priv->spinner));
}
开发者ID:SolusOS-discontinued,项目名称:athena,代码行数:9,代码来源:athena-floating-bar.c
示例20: populate_dialog
static void
populate_dialog (PpPPDSelectionDialog *dialog)
{
GtkTreeViewColumn *column;
GtkCellRenderer *renderer;
GtkTreeView *manufacturers_treeview;
GtkTreeView *models_treeview;
GtkWidget *widget;
manufacturers_treeview = (GtkTreeView*)
gtk_builder_get_object (dialog->builder, "ppd-selection-manufacturers-treeview");
renderer = gtk_cell_renderer_text_new ();
/* Translators: Name of column showing printer manufacturers */
column = gtk_tree_view_column_new_with_attributes (_("Manufacturers"), renderer,
"text", PPD_MANUFACTURERS_DISPLAY_NAMES_COLUMN, NULL);
gtk_tree_view_column_set_expand (column, TRUE);
gtk_tree_view_append_column (manufacturers_treeview, column);
models_treeview = (GtkTreeView*)
gtk_builder_get_object (dialog->builder, "ppd-selection-models-treeview");
renderer = gtk_cell_renderer_text_new ();
/* Translators: Name of column showing printer drivers */
column = gtk_tree_view_column_new_with_attributes (_("Drivers"), renderer,
"text", PPD_DISPLAY_NAMES_COLUMN, NULL);
gtk_tree_view_column_set_expand (column, TRUE);
gtk_tree_view_append_column (models_treeview, column);
g_signal_connect (gtk_tree_view_get_selection (models_treeview),
"changed", G_CALLBACK (model_selection_changed_cb), dialog);
g_signal_connect (gtk_tree_view_get_selection (manufacturers_treeview),
"changed", G_CALLBACK (manufacturer_selection_changed_cb), dialog);
gtk_widget_show_all (dialog->dialog);
if (!dialog->list)
{
widget = (GtkWidget*)
gtk_builder_get_object (dialog->builder, "ppd-spinner");
gtk_widget_show (widget);
gtk_spinner_start (GTK_SPINNER (widget));
widget = (GtkWidget*)
gtk_builder_get_object (dialog->builder, "progress-label");
gtk_widget_show (widget);
}
else
{
fill_ppds_list (dialog);
}
}
开发者ID:tigersoldier,项目名称:gnome-control-center,代码行数:57,代码来源:pp-ppd-selection-dialog.c
注:本文中的GTK_SPINNER函数示例由纯净天空整理自Github/MSDocs等源码及文档管理平台,相关代码片段筛选自各路编程大神贡献的开源项目,源码版权归原作者所有,传播和使用请参考对应项目的License;未经允许,请勿转载。 |
请发表评论