上次说到,我想加一个QTextEdit放在 my_QWidget上,在不使用其它任何控件的情况上,让QTextEdit随窗体的大小改变而布满整个窗体,如何做。
一个方法是:使用继承
TextEditWidget : public my_QWidget
{}
第二个方法是:使用函数指针
第三个方法是:使用Qt中的信号
最后重写resizeEvent虚函数:
这两种方法效果是一样的,例如:
int main(int argc, char* argv[])
{QApplication a(argc, argv); //注意,这里是QApplicationga.setStdLocaleForUTF8();my_QWidget w;QObject::connect(&w, &my_QWidget::signal_resizeEvent, [](QWidget* pw, QResizeEvent* event){std::wcout << _t("触发信号!");_pn(event->size());});w.my_resizeEvent = [](QWidget* pw, QResizeEvent* event) {std::wcout << _t("触发函数指针!");_pn(event->size());};w.show();return a.exec();
}
效果如图:
最后附上代码,只加了两行语句
my_QWidget.h
class my_QWidget : public QWidget
{Q_OBJECTpublic:public:my_QWidget(QWidget* parent = nullptr) : QWidget(parent) { }protected://---------------------------------------------------------事件重写//bool event(QEvent* event) override;//virtual void mousePressEvent(QMouseEvent* event)override;//virtual void mouseReleaseEvent(QMouseEvent* event)override;//virtual void mouseDoubleClickEvent(QMouseEvent* event)override;//virtual void mouseMoveEvent(QMouseEvent* event)override;
#if QT_CONFIG(wheelevent)//virtual void wheelEvent(QWheelEvent* event)override;
#endif//virtual void keyPressEvent(QKeyEvent* event)override;//virtual void keyReleaseEvent(QKeyEvent* event)override;//virtual void focusInEvent(QFocusEvent* event)override;//virtual void focusOutEvent(QFocusEvent* event)override;//virtual void enterEvent(QEnterEvent* event)override;//virtual void leaveEvent(QEvent* event)override;//virtual void paintEvent(QPaintEvent* event)override;//virtual void moveEvent(QMoveEvent* event);protected:virtual void resizeEvent(QResizeEvent* event)override;
public://函数指针void (*my_resizeEvent)(QWidget* pw, QResizeEvent* event) = 0;Q_SIGNALS://信号void signal_resizeEvent(QWidget* pw, QResizeEvent* event);protected://virtual void closeEvent(QCloseEvent* event)override;
#ifndef QT_NO_CONTEXTMENU//virtual void contextMenuEvent(QContextMenuEvent* event)override;
#endif
#if QT_CONFIG(tabletevent)//virtual void tabletEvent(QTabletEvent* event)override;
#endif
#ifndef QT_NO_ACTION//virtual void actionEvent(QActionEvent* event)override;
#endif#if QT_CONFIG(draganddrop)//virtual void dragEnterEvent(QDragEnterEvent* event)override;//virtual void dragMoveEvent(QDragMoveEvent* event)override;//virtual void dragLeaveEvent(QDragLeaveEvent* event)override;//virtual void dropEvent(QDropEvent* event)override;
#endif//virtual void showEvent(QShowEvent* event)override;//virtual void hideEvent(QHideEvent* event)override;//virtual bool nativeEvent(const QByteArray& eventType, void* message, qintptr* result)override;// Misc. protected functions//virtual void changeEvent(QEvent*)override; };
my_QWidget.cpp
#ifdef _QT_ ///_QT_void my_QWidget::resizeEvent(QResizeEvent* event)
{
/*在 Qt 中,resizeEvent 是一个重要的事件处理函数,用于处理控件大小改变时的事件。当用户调整窗口大小,或者通过代码调用 resize() 或 setGeometry() 改变控件的大小时,resizeEvent 会被触发。你可以重写这个函数来实现自定义的行为,例如调整子控件的大小或重新布局。1. resizeEvent 的基本用法函数原型cpp复制virtual void QWidget::resizeEvent(QResizeEvent *event);参数:event:QResizeEvent 对象,包含控件的新旧大小信息。event->size():返回控件的新大小(QSize 类型)。event->oldSize():返回控件的旧大小(QSize 类型)。调用时机:当控件的大小发生改变时,resizeEvent 会被自动调用。
*/QWidget::resizeEvent(event);if (my_resizeEvent != 0) { my_resizeEvent(this,event); //用函数指针调用函数} signal_resizeEvent(this, event); //调用Qt定义的函数}