Russian Qt Forum
Октябрь 01, 2024, 02:32 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Как узнать толщину рамки для QTextEdit (с картинкой)  (Прочитано 4649 раз)
xintrea
Супер активный житель
*****
Offline Offline

Сообщений: 754



Просмотр профиля WWW
« : Июнь 26, 2009, 16:04 »

Здравствуйте!


Потребовалось мне тут достаточно точно узнать X-координату "нуливой" позиции курсора в QTextEdit. Я создаю дополнительный курсор, ставлю его на начало текста, и узнаю его X-координату

Код:
 QTextCursor control_cur=textCursor();
 control_cur.setPosition(0);
 int x=cursorRect(control_cur).x();

Проблема в том, что мне хотелось бы узнать координату относительно всего места, выделенного виджету. А координата возвращается не от нуливой (0,0) точки виджета, а от нуливой точки, образованной за счет толщины рамок.



Таким образом, надо как-то выяснить толщину рамки. В QTextEdit проде как невозможно получить ссылку на QFrame, в которую он заключен (если возможно, то скажите как). Можно получить только некоторые значения

frameGeometry () const : QRect
frameRect () const : QRect
frameShadow () const : Shadow
frameShape () const : Shape
frameSize () const : QSize
frameStyle () const : int
frameWidth () const : int

среди которых нет толщины линий. Возможно, толщину линий можно вытянуть из frameStyle(), но понять как это сделать пока не могу.


Вопрос - как узнать толщину линий рамки, охватывающей виджет?

Записан

Собираю информацию по крупицам
http://webhamster.ru
SABROG
Гость
« Ответ #1 : Июнь 26, 2009, 16:17 »

Есть еще lineWidth(). Да и вообще все методы, которые наследуются от QFrame. Можно еще посмотреть в сторону QStyleOptionFrame:

Код
C++ (Qt)
QStyleOptionFrame o;
o.initFrom(textEdit);
int lineWidth = o.lineWidth;
 

Может это еще что-то даст:

Код
C++ (Qt)
qApp->style()->pixelMetric(QStyle::PM_DefaultFrameWidth, QStyleOptionFrame, textEdit);
 
« Последнее редактирование: Июнь 26, 2009, 16:30 от SABROG » Записан
spectre71
Гость
« Ответ #2 : Июнь 26, 2009, 16:27 »

Есть еще lineWidth(). Да и вообще все методы, которые наследуются от QFrame. Можно еще посмотреть в сторону QStyleOptionFrame:
QLineEdit не наследован от QFrame.
Записан
SABROG
Гость
« Ответ #3 : Июнь 26, 2009, 16:32 »

Есть еще lineWidth(). Да и вообще все методы, которые наследуются от QFrame. Можно еще посмотреть в сторону QStyleOptionFrame:
QLineEdit не наследован от QFrame.

Он пишет о другом классе:

Цитировать
позиции курсора в QTextEdit
Цитировать
В QTextEdit проде как невозможно получить

К тому же QLineEdit использует тоже QStyleOptionFrame:

Код
C++ (Qt)
void QLineEdit::initStyleOption(QStyleOptionFrame *option) const
{
   if (!option)
       return;
 
   Q_D(const QLineEdit);
   option->initFrom(this);
   option->rect = contentsRect();
   option->lineWidth = d->frame ? style()->pixelMetric(QStyle::PM_DefaultFrameWidth, option, this)
                                : 0;
   option->midLineWidth = 0;
   option->state |= QStyle::State_Sunken;
   if (d->readOnly)
       option->state |= QStyle::State_ReadOnly;
#ifdef QT_KEYPAD_NAVIGATION
   if (hasEditFocus())
       option->state |= QStyle::State_HasEditFocus;
#endif
   if (QStyleOptionFrameV2 *optionV2 = qstyleoption_cast<QStyleOptionFrameV2 *>(option))
       optionV2->features = QStyleOptionFrameV2::None;
}
 

поэтому это код должен быть справедлив для обоих виджетов:

Код:
QStyleOptionFrame o;
o.initFrom(lineEdit);
int lineWidth = o.lineWidth;
« Последнее редактирование: Июнь 26, 2009, 16:37 от SABROG » Записан
spectre71
Гость
« Ответ #4 : Июнь 26, 2009, 16:44 »

А чем не подходит frameWidth()
Записан
spectre71
Гость
« Ответ #5 : Июнь 26, 2009, 16:52 »

А для QLineEdit* edt; проще так:

  QStyleOptionFrameV2 option;
  edt->initStyleOption(&option);
  QRect Rect = style()->subElementRect(QStyle::SE_LineEditContents, &option, edt);
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.18 секунд. Запросов: 22.