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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Как позволить пользователю менять размер виджета?  (Прочитано 4688 раз)
kUSER
Гость
« : Декабрь 11, 2009, 11:48 »

Необходимо чтобы пользователь мог менять размер QPlainText и перемещать его по форме. Наверно надо обрабатывать resizeEvent и moveEvent?
Записан
spectre71
Гость
« Ответ #1 : Декабрь 11, 2009, 11:50 »

Необходимо чтобы пользователь мог менять размер QPlainText и перемещать его по форме. Наверно надо обрабатывать resizeEvent и moveEvent?

Читайте правила форума!
Вам в раздел "Вопросы новичков"
Записан
Павел_F.
Гость
« Ответ #2 : Декабрь 11, 2009, 16:05 »

У Qt есть приложение в примерах, dockwidget называется. Смотрите его, там то что вам надо.
Записан
spectre71
Гость
« Ответ #3 : Декабрь 11, 2009, 18:25 »

Необходимо чтобы пользователь мог менять размер QPlainText и перемещать его по форме. Наверно надо обрабатывать resizeEvent и moveEvent?

Опиши задачу подробнее, зачем это нужно. Может подскажут решение получше.
А вообще посмотри доку по QWidget поскольку QPlainTextEdit уго наследник.

virtual void QWidget::mouseMoveEvent ( QMouseEvent * event )
virtual void QWidget::mousePressEvent ( QMouseEvent * event )
virtual void QWidget::mouseReleaseEvent ( QMouseEvent * event )
Записан
kUSER
Гость
« Ответ #4 : Декабрь 13, 2009, 21:16 »

Сразу спасибо за комментарии  Улыбающийся

Подробнее: На форме находится QPlainText. Необходимо чтобы пользователь мог менять размер виджета и перетаскивать его по форме.
Записан
kUSER
Гость
« Ответ #5 : Декабрь 13, 2009, 21:26 »

Просто дело в том, что виджет не должен быть доком (окном). А именно должен перемещаться по форме.
P.S. Копаю mouseEvent...
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #6 : Декабрь 13, 2009, 22:01 »

Просто дело в том, что виджет не должен быть доком (окном). А именно должен перемещаться по форме.
P.S. Копаю mouseEvent...
Не выгоднее ли изменить/продумать задачу? Например поставить в toolbar 4 маленьких кнопки/стрелки. Пользователь нажимает на одну из них - виджет перемещается влево-вправо-вверх-вниз (в зависимости от стрелки). Перекрывать QMouseEvent может быть хлопотно да и как дать пользователю понять что он может двигать QPlainText?
Записан
kUSER
Гость
« Ответ #7 : Декабрь 14, 2009, 10:33 »

Спасибо всем за ответы, попробую другие варианты.
Записан
Dendy
Гость
« Ответ #8 : Декабрь 14, 2009, 14:29 »

Вот наваял от нечего делать пример, авось поможет. Перетягивать кнопку: Alt + LeftMouseButton, изменять размер: Alt + RightMouseButton:

main.cpp
Код
C++ (Qt)
#include <QApplication>
#include <QMouseEvent>
 
#include "ui_Dialog.h"
 
 
 
 
class Resizer : public QObject
{
public:
Resizer( QWidget * widget ) :
widget_( widget )
{
isMousePressed_ = false;
widget_->installEventFilter( this );
}
 
bool eventFilter( QObject * o, QEvent * e )
{
switch ( e->type() )
{
case QEvent::MouseButtonPress:
{
QMouseEvent * me = static_cast<QMouseEvent*>( e );
 
if ( !(me->modifiers() & Qt::AltModifier) )
break;
 
isMousePressed_ = true;
pos_ = widget_->mapToGlobal( me->pos() );
}
return true;
 
case QEvent::MouseButtonRelease:
{
if ( !isMousePressed_ )
break;
 
isMousePressed_ = false;
}
return true;
 
case QEvent::MouseMove:
{
if ( !isMousePressed_ )
break;
 
QMouseEvent * me = static_cast<QMouseEvent*>( e );
 
const QPoint newPos = widget_->mapToGlobal( me->pos() );
const QPoint distance = newPos - pos_;
pos_ = newPos;
 
if ( me->buttons() & Qt::LeftButton )
widget_->move( widget_->pos() + distance );
else if ( me->buttons() & Qt::RightButton )
widget_->resize( widget_->size() + QSize( distance.x(), distance.y() ) );
}
return true;
}
 
return QObject::eventFilter( o, e );
}
 
private:
QWidget * widget_;
bool isMousePressed_;
QPoint pos_;
};
 
 
 
 
int main( int argc, char ** argv )
{
QApplication app( argc, argv );
 
QDialog dialog;
Ui::Dialog ui;
ui.setupUi( &dialog );
 
Resizer resizer( ui.button );
 
return dialog.exec();
}
 

Dialog.ui
Код
XML
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>Dialog</class>
<widget class="QDialog" name="Dialog">
 <property name="geometry">
  <rect>
   <x>0</x>
   <y>0</y>
   <width>400</width>
   <height>300</height>
  </rect>
 </property>
 <property name="windowTitle">
  <string>Dialog</string>
 </property>
 <layout class="QVBoxLayout" name="verticalLayout">
  <item>
   <widget class="QWidget" name="widget" native="true">
    <widget class="QPushButton" name="button">
     <property name="geometry">
      <rect>
       <x>120</x>
       <y>100</y>
       <width>141</width>
       <height>41</height>
      </rect>
     </property>
     <property name="text">
      <string>Drag me with Alt+Mouse</string>
     </property>
    </widget>
   </widget>
  </item>
  <item>
   <widget class="Line" name="line">
    <property name="orientation">
     <enum>Qt::Horizontal</enum>
    </property>
   </widget>
  </item>
  <item>
   <widget class="QDialogButtonBox" name="buttonBox">
    <property name="orientation">
     <enum>Qt::Horizontal</enum>
    </property>
    <property name="standardButtons">
     <set>QDialogButtonBox::Ok</set>
    </property>
   </widget>
  </item>
 </layout>
</widget>
<resources/>
<connections>
 <connection>
  <sender>buttonBox</sender>
  <signal>accepted()</signal>
  <receiver>Dialog</receiver>
  <slot>accept()</slot>
  <hints>
   <hint type="sourcelabel">
    <x>248</x>
    <y>254</y>
   </hint>
   <hint type="destinationlabel">
    <x>157</x>
    <y>274</y>
   </hint>
  </hints>
 </connection>
 <connection>
  <sender>buttonBox</sender>
  <signal>rejected()</signal>
  <receiver>Dialog</receiver>
  <slot>reject()</slot>
  <hints>
   <hint type="sourcelabel">
    <x>316</x>
    <y>260</y>
   </hint>
   <hint type="destinationlabel">
    <x>286</x>
    <y>274</y>
   </hint>
  </hints>
 </connection>
</connections>
</ui>
 

CMakeLists.txt
Код:
cmake_minimum_required( VERSION 2.6 )

find_package( Qt4 REQUIRED )
include( "${QT_USE_FILE}" )

include_directories( "${CMAKE_CURRENT_BINARY_DIR}" )

qt4_wrap_ui( Reqizer_UI_HEADERS "Dialog.ui" )

add_executable( Resizer ${Reqizer_UI_HEADERS} "main.cpp" )
target_link_libraries( Resizer ${QT_LIBRARIES} )
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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