当前位置: 首页 > article >正文

接上一主题,在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定义的函数

}

http://www.kler.cn/a/561547.html

相关文章:

  • 【LLM】本地部署LLM大语言模型+可视化交互聊天,附常见本地部署硬件要求(以Ollama+OpenWebUI部署DeepSeekR1为例)
  • 【Linux网络编程】 HTTP协议
  • C++的异步相关操作
  • 信创终端上如何将PDF文件转为OFD文件
  • [java基础-JVM篇]2_垃圾收集器与内存分配策略
  • 从DeepSeek大爆发看AI革命困局:大模型如何突破算力囚笼与信任危机?
  • 量子计算的基本运算:Hadamard 门、CNOT 门、Pauli 门详解
  • 深度学习进阶:构建多层神经网络
  • Vue 3的Proxy比Vue 2的Object.defineProperty有哪些优势?
  • 和Claude对战黑白棋!一起开发AI对弈游戏
  • C++复习专题——泛型编程(模版),包括模版的全特化和偏特化
  • 基于Springboot银行信用卡额度管理系统【附源码】
  • 广州千叶凭借多元化泳池设备,为福州文旅泳池筑就优渥水环境
  • 【ECMAScript6】
  • Hbase使用shell命令语句大全
  • css文本两端对齐
  • C语言 —— 此去经年 应是良辰好景虚设 - 函数
  • GCC 和 G++的基本使用
  • 最新前端框架选型对比与建议(React/Vue/Svelte/Angular)
  • 【qt链接mysql】