Qt源码分析--QWidget(5)--Mode

本文详细解释了QWidget的isVisibleTo()和isEnabledTo()函数,用于判断控件的显示状态和启用条件,以及isWindow()方法确定窗口属性。同时揭示了visibleRegion()方法计算可见区域的逻辑。

1.bool isVisibleTo(const QWidget *) const;

/*!
    Returns \c true if this widget would become visible if \a ancestor is
    shown; otherwise returns \c false.
    The true case occurs if neither the widget itself nor any parent
    up to but excluding \a ancestor has been explicitly hidden.
    This function will still return true if the widget is obscured by
    other windows on the screen, but could be physically visible if it
    or they were to be moved.
    isVisibleTo(0) is identical to isVisible().
    \sa show(), hide(), isVisible()
*/
bool QWidget::isVisibleTo(const QWidget *ancestor) const
{
    if (!ancestor)
        return isVisible();
    const QWidget * w = this;
    while (!w->isHidden()
            && !w->isWindow()
            && w->parentWidget()
            && w->parentWidget() != ancestor)
        w = w->parentWidget();
    return !w->isHidden();
}

如果QWidget本身或任何父级(但不包括祖先)都没有被显式隐藏,则返回true。

2.bool isEnabledTo(const QWidget

### 使用QT开发的串口上位机软件源码示例 以下是一个基于QT框架的串口上位机软件的基本实现,包含串口数据接收、解析、波形显示和数据保存功能。代码结构参考了常见的串口调试助手设计[^1],并结合了STM32串口通信的实际应用[^2]。 #### 1. 主窗口界面设计 主窗口包含串口配置(波特率、数据位等)、数据接收区、波形显示区域以及数据保存按钮。 ```python import sys from PyQt5.QtWidgets import QApplication, QMainWindow, QVBoxLayout, QPushButton, QTextEdit, QWidget, QLabel from PyQt5.QtSerialPort import QSerialPort, QSerialPortInfo from PyQt5.QtCore import QObject, pyqtSignal, QThread import pyqtgraph as pg class MainWindow(QMainWindow): def __init__(self): super().__init__() self.setWindowTitle("串口调试助手") self.serial = QSerialPort() # 界面布局 self.main_widget = QWidget() self.setCentralWidget(self.main_widget) layout = QVBoxLayout() # 波形显示 self.plot_widget = pg.PlotWidget() self.plot_data = self.plot_widget.plot([], pen=pg.mkPen('b', width=2)) layout.addWidget(self.plot_widget) # 数据接收区 self.receive_text = QTextEdit() self.receive_text.setReadOnly(True) layout.addWidget(self.receive_text) # 按钮 self.open_button = QPushButton("打开串口") self.open_button.clicked.connect(self.toggle_serial) layout.addWidget(self.open_button) self.save_button = QPushButton("保存数据") self.save_button.clicked.connect(self.save_data) layout.addWidget(self.save_button) self.main_widget.setLayout(layout) # 初始化串口 self.init_serial() def init_serial(self): available_ports = QSerialPortInfo.availablePorts() if available_ports: self.serial.setPort(available_ports[0]) self.serial.setBaudRate(QSerialPort.Baud115200) self.serial.readyRead.connect(self.read_data) def toggle_serial(self): if self.serial.isOpen(): self.serial.close() self.open_button.setText("打开串口") else: self.serial.open(QSerialPort.ReadWrite) self.open_button.setText("关闭串口") def read_data(self): if self.serial.canReadLine(): data = self.serial.readLine().data().decode().strip() self.receive_text.append(data) self.update_plot(data) def update_plot(self, data): try: value = float(data) x_data = list(range(len(self.plot_data.xData) + 1)) y_data = self.plot_data.yData + [value] self.plot_data.setData(x_data, y_data) except ValueError: pass def save_data(self): with open("received_data.txt", "w") as file: file.write(self.receive_text.toPlainText()) if __name__ == "__main__": app = QApplication(sys.argv) window = MainWindow() window.show() sys.exit(app.exec_()) ``` #### 2. 关键功能说明 - **串口初始化**:通过`QSerialPort`类完成串口配置,支持动态检测可用串口。 - **数据接收与解析**:当串口有新数据时,触发`readyRead`信号,读取数据并显示在文本框中[^1]。 - **波形显示**:使用`pyqtgraph`库绘制实时波形,便于观察采集数据的变化趋势[^1]。 - **数据保存**:将接收到的数据保存到本地文件,方便后续分析处理。 #### 3. STM32端串口发送示例 以下为STM32端的串口发送代码示例,配合上述QT上位机使用。 ```c #include "usart.h" void usart_init(void) { GPIO_InitTypeDef GPIO_InitStruct; USART_InitTypeDef USART_InitStruct; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_USART1, ENABLE); // 配置USART引脚 GPIO_InitStruct.GPIO_Pin = GPIO_Pin_9; // TX GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStruct); // 配置USART USART_InitStruct.USART_BaudRate = 115200; USART_InitStruct.USART_WordLength = USART_WordLength_8b; USART_InitStruct.USART_StopBits = USART_StopBits_1; USART_InitStruct.USART_Parity = USART_Parity_No; USART_InitStruct.USART_HardwareFlowControl = USART_HardwareFlowControl_None; USART_InitStruct.USART_Mode = USART_Mode_Tx; USART_Init(USART1, &USART_InitStruct); USART_Cmd(USART1, ENABLE); } void USARTSendByte(USART_TypeDef* USARTx, uint16_t Data) { while (USART_GetFlagStatus(USARTx, USART_FLAG_TXE) == RESET); USART_SendData(USARTx, Data); } void USARTSendStr(USART_TypeDef* USARTx, char* str) { while (*str) { USARTSendByte(USARTx, *str++); } } ``` ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

天天进步2015

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值