⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ctextbox.cpp

📁 Gambas is a graphical development environment based on a Basic interpreter, like Visual Basic. It us
💻 CPP
📖 第 1 页 / 共 2 页
字号:
/***************************************************************************  CTextBox.cpp  The TextBox class  (c) 2000-2003 Beno顃 Minisini <gambas@users.sourceforge.net>  This program is free software; you can redistribute it and/or modify  it under the terms of the GNU General Public License as published by  the Free Software Foundation; either version 1, or (at your option)  any later version.  This program is distributed in the hope that it will be useful,  but WITHOUT ANY WARRANTY; without even the implied warranty of  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the  GNU General Public License for more details.  You should have received a copy of the GNU General Public License  along with this program; if not, write to the Free Software  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.***************************************************************************/#define __CTEXTBOX_CPP#include <qapplication.h>#include <qlineedit.h>#include <qcombobox.h>#include <qlistbox.h>#include <qcursor.h>#include <qsizepolicy.h>#include "gambas.h"#include "CTextBox.h"DECLARE_EVENT(EVENT_Change);DECLARE_EVENT(EVENT_Activate);DECLARE_EVENT(EVENT_Click);#define MAX_LEN 32767/***************************************************************************  TextBox***************************************************************************/static bool get(void *_object, QLineEdit **wid, bool error = true){  QComboBox *combo;  if (TEXTBOX->isA("QLineEdit"))  {    *wid = TEXTBOX;    return false;  }  combo = COMBOBOX;  if (!combo->editable())  {    if (error)      GB.Error("ComboBox is read-only");    return true;  }  *wid = combo->lineEdit();  return false;}#define GET_TEXT_BOX() \  QLineEdit *textbox; \  if (get(_object, &textbox)) \    return;BEGIN_METHOD(CTEXTBOX_new, GB_OBJECT parent)  QLineEdit *wid = new QLineEdit(CONTAINER(VARG(parent)));  CWIDGET_new(wid, (void *)_object, "TextBox");  QObject::connect(wid, SIGNAL(textChanged(const QString &)), &CTextBox::manager, SLOT(event_change()));  QObject::connect(wid, SIGNAL(returnPressed()), &CTextBox::manager, SLOT(event_activate()));  wid->setAlignment(Qt::AlignLeft);  wid->show();END_METHODBEGIN_METHOD_VOID(CTEXTBOX_clear)  TEXTBOX->clear();END_METHODBEGIN_METHOD(CTEXTBOX_insert, GB_STRING text)  GET_TEXT_BOX();  //textbox->insert(QString(GB.ToZeroString(ARG(text))));  textbox->insert(QSTRING_ARG(text));END_METHODBEGIN_PROPERTY(CTEXTBOX_text)  if (READ_PROPERTY)    GB.ReturnNewZeroString(TO_UTF8(TEXTBOX->text()));  else    TEXTBOX->setText(QSTRING_PROP());END_PROPERTYBEGIN_PROPERTY(CTEXTBOX_length)  GB.ReturnInteger(TEXTBOX->text().length());END_PROPERTYBEGIN_PROPERTY(CTEXTBOX_alignment)  if (READ_PROPERTY)    //GB.ReturnInteger((TEXTBOX->alignment() & ALIGN_HMASK) + Qt::AlignHCenter);    GB.ReturnInteger((TEXTBOX->alignment() & ALIGN_HMASK) + Qt::AlignVCenter);  else    //TEXTBOX->setAlignment((PROPERTY(long) & ALIGN_HMASK) + Qt::AlignVCenter);    TEXTBOX->setAlignment(VPROP(GB_INTEGER) & ALIGN_HMASK);END_PROPERTYBEGIN_PROPERTY(CTEXTBOX_pos)  GET_TEXT_BOX();  if (READ_PROPERTY)    GB.ReturnInteger(textbox->cursorPosition());  else  {    int pos = VPROP(GB_INTEGER);    int len = (int)TEXTBOX->text().length();        if (pos < 0)      pos = 0;    else if (pos > len)      pos = len;          textbox->setCursorPosition(pos);  }END_PROPERTYBEGIN_PROPERTY(CTEXTBOX_read_only)  if (READ_PROPERTY)    GB.ReturnBoolean(TEXTBOX->isReadOnly());  else    TEXTBOX->setReadOnly(VPROP(GB_BOOLEAN));END_PROPERTYBEGIN_PROPERTY(CTEXTBOX_border)  GET_TEXT_BOX();  if (READ_PROPERTY)    GB.ReturnBoolean(textbox->frame());  else    textbox->setFrame(VPROP(GB_BOOLEAN));END_PROPERTYBEGIN_PROPERTY(CTEXTBOX_password)  GET_TEXT_BOX();  if (READ_PROPERTY)    GB.ReturnBoolean(textbox->echoMode() != QLineEdit::Normal);  else    textbox->setEchoMode(VPROP(GB_BOOLEAN) ? QLineEdit::Password : QLineEdit::Normal);END_PROPERTYBEGIN_PROPERTY(CTEXTBOX_max_length)  long max;  GET_TEXT_BOX();  if (READ_PROPERTY)  {    max = textbox->maxLength();    GB.ReturnInteger(max >= MAX_LEN ? 0 : max);  }  else  {    max = VPROP(GB_INTEGER);    if (max < 1 || max > MAX_LEN)      max = MAX_LEN;    textbox->setMaxLength(max);  }END_PROPERTYBEGIN_PROPERTY(CTEXTBOX_selection)  RETURN_SELF();END_PROPERTY/***************************************************************************  .TextBox.Selection***************************************************************************/BEGIN_PROPERTY(CTEXTBOX_sel_text)  GET_TEXT_BOX();  if (READ_PROPERTY)    GB.ReturnNewZeroString(TO_UTF8(textbox->markedText()));  else    textbox->insert(QSTRING_PROP());END_PROPERTYstatic void set_selection(QLineEdit *textbox, int start, int length){  int len = (int)textbox->text().length();  if (start < 0 || start >= len)  {    start = textbox->cursorPosition();    length = 0;  }  textbox->setCursorPosition(start);  if (length <= 0)    textbox->deselect();  else  {    if ((start + length) >= len)      length = len - start;    textbox->setSelection(start, length);  }}static void get_selection(QLineEdit *textbox, int *start, int *length){  *start = textbox->cursorPosition();  if (!textbox->hasMarkedText())    *length = 0;  else    *length = textbox->markedText().length();}BEGIN_PROPERTY(CTEXTBOX_sel_length)  int start, length;  GET_TEXT_BOX();  get_selection(textbox, &start, &length);  GB.ReturnInteger(length);END_PROPERTYBEGIN_PROPERTY(CTEXTBOX_sel_start)  int start, length;  GET_TEXT_BOX();  get_selection(textbox, &start, &length);  GB.ReturnInteger(start);END_PROPERTYBEGIN_METHOD_VOID(CTEXTBOX_sel_clear)  GET_TEXT_BOX();  textbox->deselect();END_METHODBEGIN_METHOD(CTEXTBOX_sel_select, GB_INTEGER start; GB_INTEGER length)  GET_TEXT_BOX();  if (MISSING(start) && MISSING(length))    textbox->selectAll();  else if (!MISSING(start) && !MISSING(length))    set_selection(textbox, VARG(start), VARG(length));END_METHODBEGIN_METHOD_VOID(CTEXTBOX_sel_select_all)  GET_TEXT_BOX();  textbox->selectAll();END_METHOD/***************************************************************************  ComboBox***************************************************************************/#undef THIS#define THIS OBJECT(CCOMBOBOX)static void setCurrentItem(void *_object, int item){  COMBOBOX->setCurrentItem(item);  if (item >= 0)    GB.Raise(_object, EVENT_Click, 0);}static void combo_set_editable(void *_object, bool ed){  QLineEdit *textbox;  if (ed)  {    if (!COMBOBOX->editable())    {      CWidget::removeFilter(COMBOBOX);      COMBOBOX->setEditable(true);      CWidget::installFilter(COMBOBOX);      QObject::connect(COMBOBOX->lineEdit(), SIGNAL(returnPressed()), &CTextBox::manager, SLOT(event_activate()));      if (CWIDGET_test_flag(THIS, WF_DESIGN))      {        get(_object, &textbox);        textbox->removeEventFilter(COMBOBOX);        COMBOBOX->setFocusProxy(0);      }    }  }  else  {    COMBOBOX->setEditable(false);  }  if (CWIDGET_test_flag(THIS, WF_DESIGN))    COMBOBOX->setFocusPolicy(QWidget::NoFocus);  COMBOBOX->calcMinimumHeight();}BEGIN_METHOD(CCOMBOBOX_new, GB_OBJECT parent)  MyComboBox *wid = new MyComboBox(CONTAINER(VARG(parent)));  QObject::connect(wid, SIGNAL(textChanged(const QString &)), &CTextBox::manager, SLOT(event_change()));  QObject::connect(wid, SIGNAL(activated(int)), &CTextBox::manager, SLOT(event_click()));  //QObject::connect(wid, SIGNAL(highlighted(int)), &CTextBox::manager, SLOT(event_click()));  CWIDGET_new(wid, (void *)_object, "ComboBox");  wid->setInsertionPolicy(QComboBox::NoInsertion);  combo_set_editable(_object, true);  wid->show();END_METHODBEGIN_METHOD_VOID(CCOMBOBOX_clear)  COMBOBOX->clear();  COMBOBOX->clearEdit();END_METHOD

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -