接上一主题,在Qt中,用信号代替函数指针,最终目标都是能直接使用lambda表达式,效果一样。
上次说到,我想加一个QTextEdit放在 my_QWidget上,在不使用其它任何控件的情况上,让QTextEdit随窗体的大小改变而布满整个窗体,如何做。
一个方法是:使用继承
TextEditWidget : public my_QWidget
{
}
第二个方法是:使用函数指针
第三个方法是:使用Qt中的信号
最后重写resizeEvent虚函数:
这两种方法效果是一样的,例如:
int main(int argc, char* argv[])
{
QApplication a(argc, argv); //注意,这里是QApplication
ga.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_OBJECT
public:
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定义的函数
}