Название: Как позволить пользователю менять размер виджета?
Отправлено: kUSER от Декабрь 11, 2009, 11:48
Необходимо чтобы пользователь мог менять размер QPlainText и перемещать его по форме. Наверно надо обрабатывать resizeEvent и moveEvent?
Название: Re: Как позволить пользователю менять размер виджета?
Отправлено: spectre71 от Декабрь 11, 2009, 11:50
Необходимо чтобы пользователь мог менять размер QPlainText и перемещать его по форме. Наверно надо обрабатывать resizeEvent и moveEvent?
Читайте правила форума! Вам в раздел "Вопросы новичков"
Название: Re: Как позволить пользователю менять размер виджета?
Отправлено: Павел_F. от Декабрь 11, 2009, 16:05
У Qt есть приложение в примерах, dockwidget называется. Смотрите его, там то что вам надо.
Название: Re: Как позволить пользователю менять размер виджета?
Отправлено: spectre71 от Декабрь 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 )
Название: Re: Как позволить пользователю менять размер виджета?
Отправлено: kUSER от Декабрь 13, 2009, 21:16
Сразу спасибо за комментарии :)
Подробнее: На форме находится QPlainText. Необходимо чтобы пользователь мог менять размер виджета и перетаскивать его по форме.
Название: Re: Как позволить пользователю менять размер виджета?
Отправлено: kUSER от Декабрь 13, 2009, 21:26
Просто дело в том, что виджет не должен быть доком (окном). А именно должен перемещаться по форме. P.S. Копаю mouseEvent...
Название: Re: Как позволить пользователю менять размер виджета?
Отправлено: Igors от Декабрь 13, 2009, 22:01
Просто дело в том, что виджет не должен быть доком (окном). А именно должен перемещаться по форме. P.S. Копаю mouseEvent...
Не выгоднее ли изменить/продумать задачу? Например поставить в toolbar 4 маленьких кнопки/стрелки. Пользователь нажимает на одну из них - виджет перемещается влево-вправо-вверх-вниз (в зависимости от стрелки). Перекрывать QMouseEvent может быть хлопотно да и как дать пользователю понять что он может двигать QPlainText?
Название: Re: Как позволить пользователю менять размер виджета?
Отправлено: kUSER от Декабрь 14, 2009, 10:33
Спасибо всем за ответы, попробую другие варианты.
Название: Re: Как позволить пользователю менять размер виджета?
Отправлено: Dendy от Декабрь 14, 2009, 14:29
Вот наваял от нечего делать пример, авось поможет. Перетягивать кнопку: Alt + LeftMouseButton, изменять размер: Alt + RightMouseButton: main.cppC++ (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.uiXML <?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.txtcmake_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} )
|