开头
这个世界都是并发的,编程里更是这样,俗话说:并发知识大,一口吃不下。想成为一名优秀的 Java 开发,学好并发,绝对是你走入高薪行列的必备能力之一。
并发涉及的知识点,其实十分琐碎。学完记不住,记住了用不对。在并发底层原理中,不仅涉及 Java 语言,更涉及 JVM、操作系统、内存、CPU 指令等,令人一头雾水。
这份笔记+学习脑图可以帮你系统地学习Java 并发编程知识,并告别碎片化获取知识的弊端。
class Widget(QWidget):
def init(self):
super().init()
self.initUI()
def initUI(self):
创建一个QLCDNumber控件,QLCDNumber用于显示一个带有仿真显示屏效果的数字
lcd = QLCDNumber(self)
创建一个QSlider控件,QSlider提供了一个水平或垂直滑动条
sld = QSlider(Qt.Horizontal, self)
vbox = QVBoxLayout()
vbox.addWidget(lcd)
vbox.addWidget(sld)
self.setLayout(vbox)
将滑动条的valueChanged信号与LCD的display槽函数连接
sld.valueChanged.connect(lcd.display)
self.setGeometry(300, 300, 300, 150)
self.setWindowTitle(‘LCD显示’)
self.show()
if name == ‘main’:
app = QApplication(sys.argv)
w = Widget()
sys.exit(app.exec_())
[](()自定义信号
自定义信号方法一:自定义信号类继承QObject
import sys
from PyQt5.QtCore import pyqtSignal, QObject
from PyQt5.QtWidgets import QMainWindow, QApplication
class MySignal(QObject): # 自定义信号需要继承QObject
sigClose = pyqtSignal()
class MainWindow(QMainWindow):
def init(self):
super().init()
self.initUI()
def initUI(self):
self.sig = MySignal():
self.sig.sigClose.connect(self.close) # 将sig的sigClose信号与窗口的close()槽函数连接
self.setGeometry(300, 300, 320, 150)
self.setWindowTitle(‘单击鼠标关闭’)
self.show()
重写mousePressEvent事件处理器,该处理器在鼠标按下时触发
def mousePressEvent(self, event):
self.sig.sigClose.emit() # 将sig的sigClose信号发出,会调用与之连接的close()槽函数
self.close()
if name == ‘main’:
app = QApplication(sys.argv)
w = MainWindow ()
sys.exit(app.exec_())
自定义信号方法二:直接在MainWindow
类中定义信号属性,不需要专门定义一个类
import sys
from PyQt5.QtCore import pyqtSignal
from PyQt5.QtWidgets import QMainWindow, QApplication
class MainWindow(QMainWindow):
直接在MainWindow类中定义信号属性,不需要专门定义一个类
sigClose = pyqtSignal()
def init(self):
super().init()
self.initUI()
def initUI(self):
将sigClose信号与窗口的close()槽函数连接
self.sigClose.connect(self.close)
self.setGeometry(300, 300, 320, 150)
self.setWindowTitle(‘单击鼠标关闭’)
self.show()
def mousePressEvent(self, event):
self.sigClose.emit()
if name == ‘main’:
app = QApplication(sys.argv)
w = MainWindow ()
sys.exit(app.exec_())
[](()事件对象、重写mouseMoveEvent
import sys
from PyQt5.QtWidgets import QWidget, QApplication, QLabel
class Widget(QWidget):
def init(self):
super().init()
self.initUI()
def initUI(self):
QLabel控件用于显示文本
self.label = QLabel("x: 0, y: 0 ", self)
self.label.move(10, 10)
鼠标指针移动可能会触发鼠标移动事件,该事件如果开启会被频繁触发,默认是不开启的
self.setMouseTracking(True)
self.setGeometry(300, 300, 350, 200)
self.setWindowTitle(‘事件对象’)
self.show()
def mouseMoveEvent(self, e):
x = e.x()
y = e.y()
text = f"x: {x}, y: {y}"
self.label.setText(text)
if name == ‘main’:
app = QApplication(sys.argv)
w = Widget()
sys.exit(app.exec_())
[](()对话框
======================================================================
[](()输入对话框
import sys
from PyQt5.QtWidgets import QWidget, QPushButton, QLineEdit, QInputDialog, QApplication
class Widget(QWidget):
def init(self):
super().init()
self.initUI()
def initUI(self):
self.btn = QPushButton(‘输入’, self)
self.btn.move(20, 20)
self.btn.clicked.connect(self.showDialog)
qLineEdit行编辑对象,用于单行输入
self.le = QLineEdit(self)
self.le.setEnabled(False) # 设置为不可输入
self.le.move(20, 60)
self.setGeometry(300, 300, 300, 110)
self.setWindowTitle(‘输入对话框’)
self.show()
def showDialog(self):
text, ok = QInputDialog.getText(self, ‘请输入’, ‘您的名字:’)
if ok:
self.le.setText(str(text))
if name == ‘main’:
app = QApplication(sys.argv)
w = Widget()
sys.exit(app.exec_())
[](()文件对话框
import sys
from PyQt5.QtWidgets import (QWidget, QPushButton, QLineEdit,
QFileDialog, QApplication)
class Widget(QWidget):
def init(self):
super().init()
self.initUI()
def initUI(self):
self.btn = QPushButton(‘打开文件’, self)
self.btn.move(20, 20)
self.btn.clicked.connect(self.showDialog)
self.le1 = QLineEdit(self)
self.le1.setEnabled(False)
self.le1.resize(360,22) # 调整大小
self.le1.move(20, 60)
self.le2 = QLineEdit(self)
self.le2.setEnabled(False)
self.le2.resize(360,22)
self.le2.move(20, 90)
self.setGeometry(300, 300, 400, 140)
self.setWindowTitle(‘文件对话框’)
self.show()
def showDialog(self): # ②
fileName, filetype = QFileDialog.getOpenFileName(self,
“打开文件”,
“./”,
“所有文件();;Python程序(.py);;文本文件(*.txt)”)
if fileName:
self.le1.setText(str(fileName))
self.le2.setText(str(filetype))
if name == ‘main’:
app = QApplication(sys.argv)
w = Widget()
sys.exit(app.exec_())
[](()颜色对话框
import sys
from PyQt5.QtWidgets import (QWidget, QPushButton, QFrame,
QColorDialog, QApplication)
from PyQt5.QtGui import QColor
class Widget(QWidget):
def init(self):
super().init()
self.initUI()
def initUI(self):
col = QColor(0, 0, 0)
self.btn = QPushButton(‘选择颜色’, self)
self.btn.move(20, 20)
self.btn.clicked.connect(self.showDialog)
QFrame对象frm, QFrame继承自QWidget,在窗口中表现为一块区域
self.frm = QFrame(self)
QFrame默认不可见,需要通过样式表(StyleSheet)来设置样式
self.frm.setStyleSheet(f"QWidget {{ background-color: {col.name()} }}")
self.frm.setGeometry(130, 22, 100, 100)
self.setGeometry(300, 300, 300, 150)
self.setWindowTitle(‘颜色对话框’)
self.show()
def showDialog(self):
col = QColorDialog.getColor(title=‘请选择颜色’)
if col.isValid(): # 判断是否有效,如果点击Cancel则无效
self.frm.setStyleSheet(f"QWidget {{ background-color: {col.name()} }}")
if name == ‘main’:
app = QApplication(sys.argv)
w = Widget()
sys.exit(app.exec_())
[](()字体对话框
import sys
from PyQt5.QtWidgets import (QWidget, QVBoxLayout, QPushButton,
QLabel, QFontDialog, QApplication)
from PyQt5.QtGui import QFont
class Widget(QWidget):
def init(self):
super().init()
self.initUI()
def initUI(self):
vbox = QVBoxLayout()
self.setLayout(vbox)
btn = QPushButton(‘选择字体’, self)
btn.clicked.connect(self.showDialog)
vbox.addWidget(btn)
self.font = QFont(“宋体”, 12)
self.lbl = QLabel(‘桃李春风一杯酒,江湖夜雨十年灯。’, self)
self.lbl.setFont(self.font)
vbox.addWidget(self.lbl)
self.setGeometry(300, 300, 300, 180)
self.setWindowTitle(‘字体对话框’)
self.show()
def showDialog(self):
self.font, ok = QFontDialog.getFont(self.font, caption=‘请选择字体’)
if ok:
self.lbl.setFont(self.font)
if name == ‘main’:
app = QApplication(sys.argv)
w = Widget()
sys.exit(app.exec_())
[](()PyQt5组件
==========================================================================
[](()按钮 QPushButton
import sys
from PyQt5.QtWidgets import QWidget, QPushButton, QApplication
class Widget(QWidget):
def init(self):
super().init()
self.initUI()
def initUI(self):
self.btn = QPushButton(‘未按下’, self)
self.btn.setCheckable(True) # 使按钮具有复选功能
self.btn.move(50, 30)
对于复现按钮,此处的按钮单击信号多了一个布尔型的参数,表示按下的状态
self.btn.clicked[bool].connect(self.setText)
self.setGeometry(300, 300, 280, 120)
self.setWindowTitle(‘复选按钮’)
self.show()
def setText(self, pressed):
if pressed:
self.btn.setText(“已按下”)
else:
self.btn.setText(“未按下”)
if name == ‘main’:
app = QApplication(sys.argv)
w = Widget()
sys.exit(app.exec_())
[](()复选框 QCheckBox
import sys
from PyQt5.QtWidgets import QWidget, QCheckBox, QLabel, QApplication
from PyQt5.QtCore import Qt
class Widget(QWidget):
def init(self):
super().init()
self.initUI()
def initUI(self):
cb = QCheckBox(‘显示文字’, self)
cb.move(20, 20)
cb.setTristate(True) # 开启三态选择
cb.setCheckState(Qt.Checked)
cb.stateChanged.connect(self.changeText)
self.lbl = QLabel(‘桃李春风一杯酒,江湖夜雨十年灯。’, self)
self.lbl.move(20, 60)
self.setGeometry(300, 300, 290, 120)
self.setWindowTitle(‘复选框’)
self.show()
def changeText(self, state):
if state == Qt.Checked: # Qt.Checked 2 选中
self.lbl.setText(‘桃李春风一杯酒,江湖夜雨十年灯。’)
elif state == Qt.PartiallyChecked: # Qt.PartiallyChecked 1 半选中
self.lbl.setText(‘桃李春风一杯酒,’)
else: # Qt.Unchecked 0 未选中
self.lbl.setText(‘’)
if name == ‘main’:
app = QApplication(sys.argv)
w = Widget()
sys.exit(app.exec_())
[](()列表框 QListWidget
import sys
from PyQt5.QtWidgets import (QWidget, QLabel,
QListWidget, QApplication)
class Widget(QWidget):
def init(self):
super().init()
self.initUI()
def initUI(self):
self.lbl = QLabel(self)
self.lbl.move(20, 20)
lw = QListWidget(self)
lw.addItem(“Python”)
lw.addItem(“C++”)
lw.addItem(“C#”)
lw.addItem(“Java”)
lw.resize(230, 100)
lw.move(20, 50)
将lw的currentTextChanged信号与槽函数self.TextChanged连接
currentTextChanged信号在列表框中选项文本改变时发出,并将改变后的文本作为参数传递给槽函数
lw.currentTextChanged[str].connect(self.TextChanged)
self.setGeometry(300, 300, 320, 170)
self.setWindowTitle(‘列表框’)
self.show()
def TextChanged(self, text):
self.lbl.setText(text)
self.lbl.adjustSize()
print(text)
if name == ‘main’:
app = QApplication(sys.argv)
w = Widget()
sys.exit(app.exec_())
[](()行编辑 QLineEdit
import sys
from PyQt5.QtWidgets import (QWidget, QLabel,
QLineEdit, QApplication)
class Widget(QWidget):
def init(self):
super().init()
self.initUI()
def initUI(self):
self.lbl = QLabel(self)
self.lbl.move(20, 20)
le = QLineEdit(self) # ①
le.move(20, 50)
le.textChanged[str].connect(self.TextChanged) # ②
self.setGeometry(300, 300, 280, 170)
self.setWindowTitle(‘行编辑’)
self.show()
def TextChanged(self, text): # ③
self.lbl.setText(text)
self.lbl.adjustSize()
if name == ‘main’:
app = QApplication(sys.argv)
w = Widget()
sys.exit(app.exec_())
[](()下拉式列表框 QComBox
import sys
from PyQt5.QtWidgets import (QWidget, QLabel,
QComboBox, QApplication)
class Widget(QWidget):
def init(self):
super().init()
self.initUI()
def initUI(self):
self.lbl = QLabel(self)
self.lbl.move(20, 20)
combo = QComboBox(self)
combo.addItems([“Python”, “C++”, “C#”, “Java”])
combo.setGeometry(20,50,200,30)
combo = QComboBox(self)
combo.addItem(“Python”)
combo.addItem(“C++”)
combo.addItem(“C#”)
combo.addItem(“Java”)
combo.move(20, 50)
combo.currentTextChanged[str].connect(self.TextChanged)
combo.currentTextChanged.emit(combo.currentText())
combo.setEditable(True)
combo.editTextChanged[str].connect(self.TextChanged)
self.setGeometry(300, 300, 320, 160)
self.setWindowTitle(‘下拉式列表框’)
self.show()
def TextChanged(self, text):
self.lbl.setText(text)
self.lbl.adjustSize()
if name == ‘main’:
app = QApplication(sys.argv)
w = Widget()
sys.exit(app.exec_())
[](()日历控件 QCalendarWdget
import sys
from PyQt5.QtWidgets import (QWidget, QCalendarWidget,
QVBoxLayout, QLabel, QApplication)
from PyQt5.QtCore import QDate, Qt
class Widget(QWidget):
def init(self):
super().init()
self.initUI()
def initUI(self):
cal = QCalendarWidget(self) # 创建一个日期对象
cal.setGridVisible(True) # 在日历上显示格线
cal.clicked[QDate].connect(self.showDate) # 将日历的clicked信号与槽函数self.showDate连接
self.lbl = QLabel(self) # 创建一个QLabel对象
self.lbl.setAlignment(Qt.AlignHCenter) # 居中显示
主动发出日历的clicked信号,并将日历的当前参数日期作为参数传递
cal.clicked.emit(cal.selectedDate())
vbox = QVBoxLayout()
vbox.addWidget(cal)
vbox.addWidget(self.lbl)
self.setLayout(vbox)
self.setGeometry(300, 300, 350, 300)
self.setWindowTitle(‘日历’)
self.show()
def showDate(self, date):
self.lbl.setText(date.toString())
self.lbl.adjustSize()
if name == ‘main’:
app = QApplication(sys.argv)
w = Widget()
sys.exit(app.exec_())
[](()进度条 QProgressBar
import sys
from PyQt5.QtWidgets import (QWidget, QProgressBar,
QPushButton, QApplication)
from PyQt5.QtCore import QBasicTimer
class Widget(QWidget):
def init(self):
super().init()
self.initUI()
《一线大厂Java面试真题解析+Java核心总结学习笔记+最新全套讲解视频+实战项目源码》开源
Java优秀开源项目:
- ali1024.coding.net/public/P7/Java/git
最后
针对最近很多人都在面试,我这边也整理了相当多的面试专题资料,也有其他大厂的面经。希望可以帮助到大家。
下面的面试题答案都整理成文档笔记。也还整理了一些面试资料&最新2021收集的一些大厂的面试真题(都整理成文档,小部分截图)
最新整理电子书
数日期作为参数传递
cal.clicked.emit(cal.selectedDate())
vbox = QVBoxLayout()
vbox.addWidget(cal)
vbox.addWidget(self.lbl)
self.setLayout(vbox)
self.setGeometry(300, 300, 350, 300)
self.setWindowTitle(‘日历’)
self.show()
def showDate(self, date):
self.lbl.setText(date.toString())
self.lbl.adjustSize()
if name == ‘main’:
app = QApplication(sys.argv)
w = Widget()
sys.exit(app.exec_())
[](()进度条 QProgressBar
import sys
from PyQt5.QtWidgets import (QWidget, QProgressBar,
QPushButton, QApplication)
from PyQt5.QtCore import QBasicTimer
class Widget(QWidget):
def init(self):
super().init()
self.initUI()
《一线大厂Java面试真题解析+Java核心总结学习笔记+最新全套讲解视频+实战项目源码》开源
Java优秀开源项目:
- ali1024.coding.net/public/P7/Java/git
最后
针对最近很多人都在面试,我这边也整理了相当多的面试专题资料,也有其他大厂的面经。希望可以帮助到大家。
下面的面试题答案都整理成文档笔记。也还整理了一些面试资料&最新2021收集的一些大厂的面试真题(都整理成文档,小部分截图)
[外链图片转存中…(img-8vB6HZw7-1649571010594)]
最新整理电子书
[外链图片转存中…(img-odeLdiG4-1649571010595)]