QtDesiner的安装与配置
pyuic自动生成代码运行大法
1 | class Ui_Dialog(QDialog): |
动态加载已保存的界面
注意只有designer中已经保存的界面加载时才会更新
1 | class MainForm(QMainWindow, Ui_MainWindow): |
对于显示,运行操作,写在main函数里!
属性调用:self.ui.pushButton.clicked.connect(self.bindButton)
槽函数与连接
注意事项(未解决)
如果使用自定义信号,一定要记得信号是类变量,必须在类中定义,不能在实例方法中定义,否则后面发射信号和连接槽方法时都会报错。
不过我是这么解决的:(强行定制函数ing)
1 | self.dia.comboBox_ImgType.currentIndexChanged.connect(lambda: self.RadiomicsFunc.ImgType_init( |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 class configWin(ui_configWin.Ui_configWin,QtWidgets.QWidget):
def __init__(self,parent=None):
super().__init__(parent)
self.setupUi(self)
self.sizeChanged = QtCore.pyqtSignal(int)
def resize(self,width,height):
self.sizeChanged.emit(width)
print("sizeChanged....")
super().resize(width,height)
class mainWin(QtWidgets.QMainWindow,ui_mainWin.Ui_mainWindow):
def __init__(self):
super().__init__()
self.setupUi(self)
self.configWin = configWin(self)
self.configWin.sizeChanged.connect(self.sizeChanged)报错
AttributeError: 'builtin_function_or_method' object has no attribute 'connect'
修正:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21 from PyQt5.QtCore import pyqtSignal
from PyQt5.QtGui import QWindow
class configWin(ui_configWin.Ui_configWin,QtWidgets.QWidget):
sizeChanged =pyqtSignal(int)#写在这里
def __init__(self,parent=None):
super().__init__(parent)
self.setupUi(self)
def resize(self,width,height):
self.sizeChanged.emit(width)
super().resize(width,height)
class mainWin(QtWidgets.QMainWindow,ui_mainWin.Ui_mainWindow):
def __init__(self):
super().__init__()
self.setupUi(self)
self.configWin = configWin(self)
self.configWin.sizeChanged.connect(self.sizeChanged)
关于.connect()
函数
需要注意的是,如果你的connect()
里边是一个函数,以及你的函数传参是函数,你需要注意你书写函数的格式
一个改了很久的两行:
1 | timer.timeout.connect(lambda: Bar.setValue(Bar.value()+10)) # 设置参数 |
- 报错:传入的组件参数是
NoneType
这就需要区分progressBar.setValue()
与progressBar.setValue
的区别:
- 前者其实默认是一种call(None),而返回值是NoneType
- 后者是一个函数(Reference the Method)
- 关于
lambda
- 可以认为是函数的声明,整个式子其实是对函数的调用,但是在
.connect()
中调用函数时,必须要使用该声明
几种连接方法
1 | # 第一种信号与槽连接的方法 |
MainWindow(主窗口)系列设置
Menu(一定要注意只有新建主窗口才会有菜单栏)
菜单键的相关函数
self.menu_1.setTitle(_translate(“MainWindow”, “####”)) #菜单名称
self.action_1.setText(_translate(“MainWindow”, “#####”)) #菜单选项
self.action_1.triggered.connect(self.actionHandler_1) #点击菜单选项绑定响应(def 函数)
提供四种Action信号
changed():修改Action的属性时触发(如修改toolTip的信息)
hovered():Action关联的菜单项或者鼠标停留或者按下快捷键时触发
toggled(bool checked):Action设置checkable属性,关联的菜单项或toolBar在点击后会改变选中状态,触发toggled信号,参数为是否选中的最新状态。
triggered(bool checked):鼠标点击或者快捷键时触发。
- 给动作绑定事件:
self.savelog.triggered.connect(self.saveLogs)
其中self.saveLog
是动作名称,self.aveLogs
是需要绑定的事件。
表示self.saveLog
被触发时调用self.aveLogs
函数事件
Scroll Area
设置 ScrollAreaWidgetContents 的minimumSize属性,只有窗口大小小于这个值的时候,滑块才生效。
实际上相当于scrollArea内部创建了一个子区域,如果子区域大于最外区域,则出现滑块,如果只想出现一边有滑块,没有的那一边建议子块的最小值设置为0
ComboBox
访问QComboBox的列表项
1 | int currentlndex():返回当前项的序号,第一个项的序号为0。 |
槽函数
1 | self.reco_comboBox.currentIndexChanged.connect( |
QSlider
重写slider点哪里到哪里
新建包mySlider(或者直接新建类也行),就差个导入么
1 | from PyQt5 import QtCore, QtGui, QtWidgets |
主程序调用,connect是自定义slot
1 | class MainWindow(Ui_Form, QMainWindow): # 创建窗口 |
美化
1 | /*horizontal :水平QSlider*/ |
QCheckBox
常用方法
方法 | 描述 |
---|---|
setChecked() |
设置复选框的状态,True为选中,False为取消选中复选框 |
setText() |
设置复选框的显示文本 |
text() |
返回复选框的显示文本 |
isChecked() |
检查复选框是否被选中 |
setCheckState() |
设置复选框的勾选状态:2为选中(Checked);1为半选中(ParticallyChecked);0为没有选中(Unchecked) |
setTristate(bool) |
三态模式 |
isChecked()
不能单独使用,要用stateChanged.connect
连接起来
但是更建议使用toggle.connect()
1 | self.dia.checkBox_2.stateChanged.connect(lambda: self.test()) |
我改了无数次的代码是这样的,如果只是ischecked不会更新!!!
这个故事告诉我们,状态类的函数需要手动对他一直进行状态检查
1 | self.checkBox1.stateChanged.connect(lambda: self.btnstate(self.checkBox1)) |
常用信号
信号 | 描述 |
---|---|
clicked(bool) |
鼠标左键被按下,一直按着或者释放时,或者快捷键被按着或者释放时触发该信号 |
pressed() |
当鼠标指针在按钮上并按下左键时触发该信号,一直按着或者按下并释放都会产生 |
released() |
鼠标左键被释放时触发 |
toggled(checked) |
checkable设置为True时,状态发生改变时触发信号 |
测试代码
chk1Status = self.dia.checkBox_2.text() + ", isChecked=" + str( self.dia.checkBox_2.isChecked()) + ', chekState=' + str( self.dia.checkBox_2.checkState()) + "\n" print(chk1Status)
输出:Normalization, isChecked=True, chekState=2
RadioButton
- 单选框默认开启自动互斥(autoExclusive)。如果启用了自动互斥,属于同一个父部件的单选框的行为就和属于一个互斥按钮组的一样。如果你需要为属于同一父部件的单选框设置多个互斥按钮组,把它们加入QButtonGroup中。
- 每当一个按钮切换选中或未选中状态时,会发出的toggled()信号。如果希望每个按钮切换状态时触发一个动作,连接到这个信号。使用isChecked()来查看特定按钮是否被选中。
- 单选框可以显示文本,以及可选的小图标。图标使用setIcon()来设置,文本可以在构造函数或通过setText()来设置。可以指定快捷键,通过在文本中的特定字符前指定一个&。
QTextBrowser(文本浏览框)
适用于多行不可修改文字在UI中的呈现
修改函数
- 调用append方法可以向文本浏览框中添加文本
1
self.textBrowser.append("Hello World!")
样式表
- 不建议在designer里直接敲字,我发现这东西有一个雷点在于如果你直接往上边敲字是样式是没什么改变的,但是如果是
append
方法就可以按样式表的来
QPushBUtton
参数设置&样式表美化
- toolTip:在点击按钮时会鼠标下方会出现的小提示
- 蓝黑科技感样式表
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17QPushButton{
background-color: transparent;
color:rgb(137, 195, 235);
border:1px solid #89c3eb;
font: 75 13pt "Bahnschrift";
}
QPushButton:hover{
color:rgb(53, 171, 239);
border-radius:6px;
border:2px solid #2980b6;
}
QPushButton:pressed{
border: 1px solid #3C3C3C;
border-radius:6px;
background:rgb(124, 195, 255);
} - 当需要单独设置某个按钮的样式表时,如果有状态限制需要每一个后边都限定状态(比如下边的hover状态设置)
1
2
3
4
5
6
7
8
9
10
11
12
13#pushButton_ori_2,#pushButton_ori,#pushButton_2,#pushButton{
background-color: transparent;
color:rgb(137, 195, 235);
font: 75 13pt "Bahnschrift";
border:none;
}
#pushButton_ori_2:hover,
#pushButton_ori:hover,
#pushButton_2:hover,
#pushButton:hover{
color:rgb(52, 231, 254);
border:none;
}
Example
好用的腾讯会议高仿例子:
最小化按钮样式表:
1 | QPushButton{ |
关闭按钮样式表:
1 | QPushButton{ |
设置按键样式表:
tip:把鼠标移到按钮上时的图片改为原图片的淡化版,大小35左右为佳。
1 | QPushButton{ |
QProgressBar
常用方法
setRange(): 设置进度条的取值范围(最小值和最大值)
setMinimum(): 设置进度条的最小值
setFont(): 设置文本字体
setMaximum(): 设置进度条的最大值
setValue(): 设置进度条的值
reset(): 让进度条重新回到开始位置
setOrientation(): 设置进度条方向(水平: Qt.Horizontal, 垂直: Qt.Vertical)
setTextVisible(): 设置进度条的文本是否可见
setTextDirection(): 设置文本方向,只对垂直进度条有效
setInvertedAppearance(): 设置进度条的方向(True/False: 正反方向)
setFormat(): 设置文本字符串的格式(%p, 百分比显示,这是默认情况, %v: 当前进度, %m :总步数)
美化
1 | QProgressBar { |
其中可以调整x2:2
的数值,比如改为x2:1
会使得渐变色变化速度更快且最终的颜色最深。
进度条更新并跳出新界面(可以做启动画面)
原教程在这里,笨人对代码作了一些注释,后面附有修改
作者源代码(不完全)
背景建议使用Qframe
,QprogressBar
样式表设置参见上美化
- 设置定时器,实际上这个Bar并不是根据加载进度走的,而是100ms更新一次
- 实际上如果你想与你的程序进度连接的话,只要把
self.load_progress_bar
放在你需要的位置就行1
2
3
4def set_loader(self):
self.timer = QtCore.QTimer() #建立一个计时器
self.timer.timeout.connect(self.load_progress_bar)
self.timer.start(100) #更新时间间隔
- 实际上如果你想与你的程序进度连接的话,只要把
- 对进度条操作,每次加一,大于既定值时执行操作;此处是关闭本界面,调用打开新界面的函数,并停止计时
1
2
3
4
5
6
7
8def load_progress_bar(self):
self.progressBar.setValue(self.progressBar.value() + 1)
#self.cont_label_title[0] += 1 #这两行暂时不知道是什么意思,但是好像对功能实现没有影响
#self.cont_label_title[1] += 1
if self.progressBar.value() >= 100:
self.window.close()
self.open_table_main()
self.timer.stop() - 调用新界面产生函数
1
2
3
4
5def open_table_main(self):
self.MainWindow = QtWidgets.QMainWindow()
self.ui = Ui_MainWindow()
self.ui.setupUi(self.MainWindow)
self.MainWindow.show()
笨人修改
QFileDialog
教程
获取文件夹路径,对话框获取文件
QLineEdit
常用API
QLineEdit.text():返回输入框的当前文本。
QLineEdit.addAction(Action,QLineEdit.ActionPosition):添加动作到文本输入栏,上面已经举过例子了。
QLineEdit.setAlignment(Qt.Alignment flag):属性保存了输入框的对齐方式(水平和垂直方向。
QLineEdit.setCompleter() :输入栏的自动补全就是靠这个实现的,下下章我们讲解。
QLineEdit.deselect() :取消选中任何已选中的文本。
QLineEdit.displayText():返回显示的文本。默认值为一个空字符串。
setEchoMode():如果echoMode是Normal,和text()返回的一样;如果EchoMode是Password或PasswordEchoOnEdit,会返回平台相关的密码掩码字符;如果EchoMode是NoEcho,返回一个空字符串””。
QLineEdit.selectedText():返回选中的的文本。如果没有选中,返回一个空字符串。默认为一个空字符串。
QLineEdit.setCursorPosition(QLineEdit.cursorPosition):设置输入框当前光标的位置。
QLineEdit.setMaxLength(int):此属性包含文本的最大允许长度。如果文本太长,将从限制的位置截断。默认值为32767。
QLineEdit.setReadOnly(bool):此属性保存输入框是否为只读。在只读模式下,用户仍然可以将文本复制到剪贴板,但不能编辑它,且不显示光标。
QLineEdit.setSelection(int start, int length) :从位置start选择文本为length个字符,允许负长度。我们一启动程序是否设置setSelection的,效果如下:
QLineEdit.setValidator():设置输入框的验证器,将限制任意可能输入的文本
placeholderText
用于输入前的提示显示文字该属性包含行编辑的占位符文本。只要行编辑为空,设置此属性将使行编辑显示一个灰色的占位符文本。
通常情况下,即使具有焦点,空行编辑也会显示占位符文本。但是,如果内容是水平居中的,则行编辑具有焦点时,占位符文本不会显示在光标下方。默认情况下,该属性包含一个空字符串。
QLineEdit.isClearButtonEnabled(bool) :是否设置清除内容的按钮。
QLineEdit.setInputMask():设置掩码,效果就是我们演示视频中的License输入。
信号
selectionChanged() :只要选择改变这个信号就会被发射。
cursorPositionChanged(int old, int new) :只要光标移动,这个信号就会发射。前面的位置old,新的位置是new。
editingFinished():按下返回或回车键或线条编辑失去焦点时发出此信号。
returnPressed():按下返回或回车键时发出此信号。
textChanged(str):只要文字发生变化就会发出此信号。文本参数是新文本。与textEdited()不同,当通过调用setText()以编程方式更改文本时,也会发出此信号。
textEdited(str) :无论何时编辑文本都会发出此信号。文本参数是新文本。与textChanged()不同,当以编程方式更改文本时,不会发出此信号,例如通过调用setText()。
函数
clear() :清除输入框内容
copy():如果echoMode()是Normal,将选中的文本复制到剪贴板。
cut() :如果echoMode()是Normal,将所选文本复制到剪贴板并删除它。 如果当前的验证不允许删除选定的文本,cut()将复制而不删除。
paste() :如果输入框不是只读的,插入剪贴板中的文本到光标所在位置,删除任何选定的文本。如果最终的结果不被当前的验证器接受,将没有任何反应。
redo() :重做上次操作,如果redo可用(isRedoAvailable() )。
selectAll() :选中所有文本(即:高亮),并将光标移动到末尾。当一个默认值被插入时,这非常有用,因为如果用户在点击部件之前就输入,选中的文本将被删除。
setText(str) :设置输入框显示的文本。
undo() :撤消上次操作(如果撤销可用)
QGroupBox
- 去掉不需要的标题栏
1
QGroupBox::setStyleSheet("QGroupBox{ margin-top:0px;} QGroupBox:title {margin-top: 0px;}");
Widget(通用窗口)系列设置
通用窗口不包含菜单栏、工具栏!
侧边栏修改
特定对口修改
对于文字颜色或者背景色背景图片填充的修改建议直接在相应参数的styleSheet中修改
注意这个修改需要选中后每一条进行修改,比方说菜单栏,每一个菜单栏的下属栏等等。
示例如下:
- color,background-color等等直接用
- 贴图:
1
2
3
4background-image:url(:/Img/main_bgimg.jpg);
#直接给背景贴图
MainWindow{background-image:url(:/Img/main_bgimg.jpg);}
#直接给背景贴图
- 值得注意的是,如果较大类中设置了背景,建议使用
#name
来限定插图范围,不然大类里边的小组件样式表是不起作用的
TabWidget Setting
- 修改表头:
CurrentTabText
- 修改是否可选:
setTabEnabled(int index, bool enable)
QlineEdit
.setPlaceholderText("")
:提示输入内容
泛泛修改
只改动MainWindow即可
注意所有对样式表的修改直接在他给的条目里选择就可以,不需要手动输入标签,只要把类写出来就行
QMainWindow主窗口
QLabel纯文字
1 | { |
特殊修改
QCombobox
外观
1 | /*QCombobox主体*/ |
常用页操作
StakedWight实现点击按钮更换界面布局
- 在containers中找到stacked Widget(注意不是建立新的界面)并拖动成自己需要的大小
- 对界面进行编辑,需要的buttons拖动到上边便会成为其子部件
- pyuid生成代码
- 添加连接函数,注意menu用
triggered
button用clicked
1
2
3
4
5
6#添加换页槽函数
self.actionRadiomic.triggered.connect(self.display1)
def display1(self):
self.stackedWidget.setCurrentIndex(1)
#注意页码子控件一般是从0开始,1为第二页,默认初始显示0
窗口与窗口调用
子窗口的调用
子窗口部件无反应问题
笨人已经搞到崩溃,等查到debug方式的时候整个人已经萎了喝喝,父窗口改成WindowModel就可以了
这是模式窗口属性,有三个值:NoModal指没有模式,也就是不会阻塞其他窗口应用的模式;WindowModal就是单窗口层次模式,只准其本身与其子窗口可以使用;ApplicationModal就是应用模式,除了本身其他窗口都不能使用。
PyQt5的QSS美化
样式表调用
样式表写出,但不显示
前边的限制用#name
加括号,限定对象,在多页切换的工具中要单选出改页面(建议在右侧的工具栏中选择并进行修改)
qss调用
主函数 全局调用
1 | styleFile = './pyqt5/qss/style.qss' |
设置图片样式表
但是你一定要知道图片要用png格式,只有你能显示出来那个缩略图才说明成功了border-image:url(D:/www/xxx/Pytorch/Braintumor/PyQt_test/Img/Hydrogen.jpg);
一些主题
好看的字体加颜色
- 深蓝色+柔和体(松散衡水体感觉是)
1
2color: rgb(44, 62, 80);
font: italic 11pt "Cascadia Code SemiLight"; - 适合做题目的可爱点字体
1
font: 15pt "Cooper Black";
- 圆润的正常体
1
font: 9pt "Arial Rounded MT Bold";
qtawesome使用总结
- 展示图标库
1
对某个控件的所有子控件进行集体美化
1 | self.left_widget.setStyleSheet(''' |
QTabWidget样式
QTabWidget
- QTabWidget显示区域的属性设置
要在大控件里添加1
2
3
4
5
6
7
8QTabWidget::pane {
border-top: 1px solid #E5E5E5;
border-left:1px solid #E5E5E5;
position: absolute;
font-size: 14px;
background-color:#FFFFFF;
top:-1px #稍微遮一点点选项卡的上部
} - QTabWidget 选择项的属性设置
自己的代码~一定要注意伪状态后边是没有空格的!要不然没反应别人的代码(我就加注释啦)1
2
3
4
5
6
7
8
9
10
11
12
13
14QTabBar::tab{
background-color: rgb(41, 128, 182);
min-width:250px;
min-height:70px;
border-top-left-radius: 15px;
border-top-right-radius: 15px;
color: rgb(44, 62, 80);
font: italic 11pt "Cascadia Code SemiLight";
}
QTabBar::tab:hover{
background-color: rgb(137, 195, 235);
border-right:2px solid;
border-top:2px solid;
}只有出现TabBar才会设置标签项的颜色1
2
3
4
5
6
7
8
9
10
11
12
13
14QTabBar::tab{
background-color: rgb(41, 128, 182);
min-width:250px;#宽度
min-height:70px;#高度
border-top-left-radius: 15px;
border-top-right-radius: 15px;
color: rgb(44, 62, 80);
font: italic 11pt "Cascadia Code SemiLight";
}
QTabBar::tab:hover{
background-color: rgb(137, 195, 235);
border-right:2px solid; #如果要设置颜色的话在solid之后加一个#颜色
border-top:2px solid;
}1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20QTabBar::tab {
border: none;
border-bottom-color: #FFFFFF; /* same as the pane color */
border-top-left-radius: 4px;
border-top-right-radius: 4px;
min-width: 8ex;
padding: 2px;
font-size: 14px;
background-color:#FFFFFF;
}
QTabBar::tab:selected, QTabBar::tab:hover {
background-color:#FFFFFF;//选中背景色
}
QTabBar::tab:selected {
border:none; #去掉边框
color:#2080F7;//选中颜色
border-bottom: 2px solid #2080F7;
font-weight:bold;
background-color:#FFFFFF;
} - QTabWidget 头部属性设置
1
2
3
4
5
6
7
8QTabWidget::tab-bar {
border-top: 2px solid #E5E5E5;
border-bottom: 2px solid #E5E5E5;
border-left:1px solid #E5E5E5;
alignment: center;//居中显示
font-size: 14px;
background-color:#FFFFFF;
} - 头部选项卡
QTabBar::tab
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38QTabBar::tab {
background: #051322;
color:#7F8997;
border: 2px;
border-top-left-radius: 10px;
border-top-right-radius: 10px;
min-width: 200px;
min-height: 35px;
padding: 2px;
}
QTabBar::tab:selected{
background-color: white;
color:#001330;
}
QTabBar::tab:first{
min-width: 35px;
background-color: #2489F2;
border-top-left-radius: 3px;
border-top-right-radius: 3px;
background-image: url(:/Resources/image/homepage.png);
background-position: center;
background-repeat: no-repeat;
}
QTabBar::tab:first:hover{
min-width: 35px;
background-color: #2489F2;
border-top-left-radius: 3px;
border-top-right-radius: 3px;
background-image: url(:/Resources/image/homepage_hover.png);
background-position: center;
background-repeat: no-repeat;
}
QTabBar::close-button{
border-image: url(:/Resources/image/close.png);
}
QTabBar::close-button:hover{
border-image: url(:/Resources/image/close_hover.png);
} - 内容区美化
1
2
3
4
5
6
7
8//设置内容区域边框
QTabWidget::pane{
border:none;
}
//标题栏左侧间距
QTabWidget::tab-bar {
left: 1px;
} - 头部属性设置
1
2
3
4
5
6
7
8QTabWidget::tab-bar {
border-top: 2px solid #E5E5E5;
border-bottom: 2px solid #E5E5E5;
border-left:1px solid #E5E5E5;
alignment: center;
font-size: 14px;
background-color:#FFFFFF;
} - 图片插入的一个小例子
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30#最左边标签未选中时显示(因为需要左边打圆角,所以和其他背景图片不一样,注意字体颜色)
QTabBar::tab:first:!selected {
color:#000000;
border-image: url(:/common/images/common/左_normal.png);
}
#最左边标签被选中
QTabBar::tab:first:selected {
color:#FFFFFF;
border-image: url(:/common/images/common/左_pressed.png);
}
#最右边标签未选中时显示(因为需要右边打圆角,所以和其他背景图片不一样)
QTabBar::tab:last:!selected {
color:#000000;
border-image: url(:/common/images/common/右_normal.png);
}
#最右边标签被选中
QTabBar::tab:last:selected {
color:#FFFFFF;
border-image: url(:/common/images/common/右_pressed.png);
}
#中间的标签未被选择的显示
QTabBar::tab:!selected {
color:#000000;
border-image: url(:/common/images/common/中_normal.png);
}
#中间标签选中显示的图片
QTabBar::tab:selected {
color:#FFFFFF;
border-image: url(:/common/images/common/中_pressed.png);
} - 改变左右滑动的按钮
1
2
3
4
5
6
7
8
9QTabBar QToolButton {
border: none;
color: rgb(255, 206, 6);
background-color: #0b0e11;
}
QTabBar QToolButton:hover {
background-color: rgb(44, 62, 80) ;
}
利用QProxyStyle
改变TabBar
位置并改变文字方向
但是是C语言()
1 | #include <QPainter> |
调用:
1 | ui->tabWidget->setTabPosition(QTabWidget::West); |
自己做的好看的成品嘿嘿
- 蓝色的选项卡
1
2
3
4
5
6
7
8
9
10
11
12
13QTabBar::tab{
background-color: rgb(41, 128, 182);
min-width:250px;
min-height:70px;
color: rgb(44, 62, 80);
font: italic 11pt "Cascadia Code SemiLight";
}
QTabBar::tab:hover,QTabBar::tab:selected{
border:5px solid #bce2e8;
background-color: rgb(137, 195, 235);
border-right:2px solid;
border-top:2px solid;
}
QFrame制作无边框窗口
1 | #frame |
QGruopBox
1 | QGroupBox{ |
Scroll Area
设置背景图片要设定里边那个Widget的样式,要不然所有子控件都会被改
1 | #scrollAreaWidgetContents{ |
QComboBox
指定下拉箭头图片自定义,图片文件为name.png
- 所有的下拉箭头
1
QConboBox:drop-down{image:url(name.png)}
- 指定ID的下拉箭头
1
QComboBox#myQComboBox::drop-down {image:url(dropdown.png)}
QSS伪状态
QSS的伪状态选择器是一个以冒号开头的选择表达式,限制控件在某种状态时才可以使用QSS规则,只能描述某一个控件或者一个复合控件的自控件的状态,只能放在选择器的最后边。
hover:鼠标指针经过的状态
1 | QComboBox:hover{background-color:red} |
:!hove
可表示没有鼠标经过的状态
实例:
1 | import sys |
MainWindow:直接在retranslateUi后边设置
1 | #MainWindow.setWindowOpacity(0.9) # 设置窗口透明度 |
PushButton:直接在初始setup后设置
- 设置按钮前的图标
1
2
3
4
5
6
7
8
9
10spin_icon = qtawesome.icon('fa5s.microphone-alt', color='white')
#图标名参考示例格式,以及qtawesome的readme中对于库的提示来写,格式就是 库.图标名
self.pushButton.setIcon(spin_icon)#设置图标
self.pushButton.setIconSize(QtCore.QSize(50,50))#需要导入库from PyQt5.QtCore import QSize
self.pushButton.setStyleSheet('''QPushButton{background-color: rgb(70, 70, 70);
color: rgb(255, 255, 255);}
QPushButton:hover{color:white;
border:2px solid #F3F3F5;
border-radius:35px;
background:darkGray;}''') - 图标+圆角(图标用的是flaticon)
在qss文件添加以下内容:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26/*设置控件的背景*/
QTabWidget
{
background-color:rgb(104,191,249);
}
/*设置控件下面板的背景颜色*/
QTabWidget::pane
{
background-color: rgb(228, 233, 242);
border:none;
}
/*设置控件下选择页的颜色*/
QTabBar::tab
{
font: 15pt "Chinese fine black";
background-color:rgb(104,191,249);
min-width: 60px;
min-height: 30px;
padding: 2px;
}
/*设置控件下选择页被选中的颜色*/
QTabBar::tab:selected
{
background-color: rgb(228, 233, 242);
}
将最大化最小化按钮设置为像苹果的三个点点
1 | class gui_view(QWidget): |
最小化
1 | QPushButton{ |
关闭
1 | QPushButton{ |
少许动画操作
静态图片+动态文字
1 | app = QApplication(sys.argv) |
动态图gif
使用label实现:
1 | self.gif = QMovie('bg2.gif') |
完整代码如下:
1 | app = QApplication(sys.argv) |
源代码
class_test
1 | import sys |
showImage
1 |
|
VTK(Vedo)实现
可以进行3D可视化,显示感兴趣区域,2D切割,使用的mySlicer是在vedo3dslicer上修改的,只是三个切片分别分装
1 | import pandas as pd |
New_UI单模态的可视化
1 | import nibabel |
PyRadiomicsPage
1 | from __future__ import print_function |
RadioML
直接使用python对R语言调用
``ruby
#from rpy2 import robjects
import logging
import os
import platform
from functools import lru_cache
from rpy2.situation import get_r_home, get_rlib_path
def _fix_r_home():
“””
Fix the R_HOME env var if we need to
“””
r_home = os.environ.get(“R_HOME”)
#print(r_home)
if r_home:
os.environ["R_HOME"] = r_home.replace("\\", "/")
if not get_r_home():
raise OSError("R_HOME is not set.")
def _add_dll_directory():
“””
Adds the platform’s R library path to the allowed library
load dirs. Stops weird DLL loading issues if you are using
R in a different path than the system install dir.
Only applicable on Windows
"""
if "add_dll_directory" not in dir(os):
return # not windows
r_home = get_r_home()
system = platform.system()
dll_location = get_rlib_path(r_home, system)
dll_files_location = os.path.dirname(dll_location)
if dll_files_location not in os.getenv("PATH"):
logging.warning(f"R DLL location is not in the path: {dll_files_location}")
# fix security in recent Python versions
os.add_dll_directory(dll_files_location)
@lru_cache
def get_robjects():
“””
Fix path and DLL loading issues before loading rpy2
“””
_fix_r_home()
_add_dll_directory()
from rpy2 import robjects
from rpy2.robjects import pandas2ri
pandas2ri.activate()
return robjects
class RadioML():
def init(self):
pass
def Main(self,robjects):
robjects.r.source(‘./RadioML-main.R’)
def Features(self,robjects):
robjects.r.source(‘./RadioML_features.R’)
def Score(self,robjects):
robjects.r.source(‘./RadioML_score.R’)
new_robjects = get_robjects()
test = RadioML()
test.Main(new_robjects)
#”D:/www/xxx/Pytorch/Braintumor/PyQt_test/lib/RadioML-main/RadioML_main.R”
1 |
|
graphicsView刷新
QLayout: Attempting to add QLayout “” to QGraphicsView “graphicsView_4”, which already has a layout
DataProgress
1 | from radiomics import featureextractor |