經過幾天的折騰終於弄好動態加載checkboxs,特此記錄:
首先上基礎UI文件。
# -*- coding: utf-8 -*- # Form implementation generated from reading ui file 'auto_lr.ui' # # Created by: PyQt4 UI code generator 4.11.4 # # WARNING! All changes made in this file will be lost! from PyQt4 import QtCore, QtGui try: _fromUtf8 = QtCore.QString.fromUtf8 except AttributeError: def _fromUtf8(s): return s try: _encoding = QtGui.QApplication.UnicodeUTF8 def _translate(context, text, disambig): return QtGui.QApplication.translate(context, text, disambig, _encoding) except AttributeError: def _translate(context, text, disambig): return QtGui.QApplication.translate(context, text, disambig) class Ui_Frame(object): def setupUi(self, Frame): Frame.setObjectName(_fromUtf8("Frame")) Frame.resize(767, 563) Frame.setFrameShape(QtGui.QFrame.StyledPanel) Frame.setFrameShadow(QtGui.QFrame.Raised) self.pushButton = QtGui.QPushButton(Frame) self.pushButton.setGeometry(QtCore.QRect(670, 250, 91, 51)) self.pushButton.setObjectName(_fromUtf8("pushButton")) self.pushButton_2 = QtGui.QPushButton(Frame) self.pushButton_2.setGeometry(QtCore.QRect(670, 340, 91, 51)) self.pushButton_2.setObjectName(_fromUtf8("pushButton_2")) self.textEdit = QtGui.QTextEdit(Frame) self.textEdit.setGeometry(QtCore.QRect(20, 410, 721, 141)) self.textEdit.setObjectName(_fromUtf8("textEdit")) self.layoutWidget = QtGui.QWidget(Frame) self.layoutWidget.setGeometry(QtCore.QRect(21, 11, 731, 51)) self.layoutWidget.setObjectName(_fromUtf8("layoutWidget")) self.horizontalLayout = QtGui.QHBoxLayout(self.layoutWidget) self.horizontalLayout.setObjectName(_fromUtf8("horizontalLayout")) self.label = QtGui.QLabel(self.layoutWidget) self.label.setObjectName(_fromUtf8("label")) self.horizontalLayout.addWidget(self.label) self.lineEdit = QtGui.QLineEdit(self.layoutWidget) self.lineEdit.setObjectName(_fromUtf8("lineEdit")) self.horizontalLayout.addWidget(self.lineEdit) self.pushButton_3 = QtGui.QPushButton(self.layoutWidget) self.pushButton_3.setObjectName(_fromUtf8("pushButton_3")) self.horizontalLayout.addWidget(self.pushButton_3) self.checkBox_4 = QtGui.QCheckBox(Frame) self.checkBox_4.setGeometry(QtCore.QRect(20, 140, 71, 16)) self.checkBox_4.setObjectName(_fromUtf8("checkBox_4")) self.layoutWidget_2 = QtGui.QWidget(Frame) self.layoutWidget_2.setGeometry(QtCore.QRect(20, 70, 731, 51)) self.layoutWidget_2.setObjectName(_fromUtf8("layoutWidget_2")) self.horizontalLayout_2 = QtGui.QHBoxLayout(self.layoutWidget_2) self.horizontalLayout_2.setObjectName(_fromUtf8("horizontalLayout_2")) self.label_2 = QtGui.QLabel(self.layoutWidget_2) self.label_2.setObjectName(_fromUtf8("label_2")) self.horizontalLayout_2.addWidget(self.label_2) self.lineEdit_2 = QtGui.QLineEdit(self.layoutWidget_2) self.lineEdit_2.setObjectName(_fromUtf8("lineEdit_2")) self.horizontalLayout_2.addWidget(self.lineEdit_2) self.pushButton_5 = QtGui.QPushButton(self.layoutWidget_2) self.pushButton_5.setObjectName(_fromUtf8("pushButton_5")) self.horizontalLayout_2.addWidget(self.pushButton_5) self.pushButton_4 = QtGui.QPushButton(Frame) self.pushButton_4.setGeometry(QtCore.QRect(670, 160, 91, 51)) self.pushButton_4.setObjectName(_fromUtf8("pushButton_4")) self.retranslateUi(Frame) QtCore.QMetaObject.connectSlotsByName(Frame) def retranslateUi(self, Frame): Frame.setWindowTitle(_translate("Frame", "LR多場景自動串行執行器V1.2", None)) self.pushButton.setText(_translate("Frame", "執行壓測", None)) self.pushButton_2.setText(_translate("Frame", "停止壓測", None)) self.label.setText(_translate("Frame", "場景目錄 ", None)) self.pushButton_3.setText(_translate("Frame", "瀏覽", None)) self.checkBox_4.setText(_translate("Frame", "全選", None)) self.label_2.setText(_translate("Frame", "Loadrunner安裝目錄", None)) self.pushButton_5.setText(_translate("Frame", "瀏覽", None)) self.pushButton_4.setText(_translate("Frame", "掃描場景文件", None)) if __name__ == "__main__": import sys app = QtGui.QApplication(sys.argv) Frame = QtGui.QFrame() ui = Ui_Frame() ui.setupUi(Frame) Frame.show() sys.exit(app.exec_())
動態加載代碼
#coding=utf8 import sys import os from PyQt4 import QtCore, QtGui from auto_lr_ui_rc import Ui_Frame,_translate,_fromUtf8 from logic import exe_lr class MainApp(QtGui.QFrame): def __init__(self): QtGui.QFrame.__init__(self) #Frame = QtGui.QFrame() self.ui = Ui_Frame() self.ui.setupUi(self) #self.ui.retranslateUi(self) self.main_threads=exe_lr.Work_Threads() self.scan_thread=exe_lr.Scan_Worker() self.ui.checkBox_4.stateChanged.connect(self.select_all_ckbox) self.ui.pushButton_3.clicked.connect(self.get_scripter_folder) self.ui.pushButton_5.clicked.connect(self.get_lr_folder) self.ui.pushButton.clicked.connect(self.start_run_lr) self.ui.pushButton_2.clicked.connect(self.stop_lr) self.ui.pushButton_4.clicked.connect(self.scan_files) self.connect(self.scan_thread, QtCore.SIGNAL("runlr_app_log(QString)"),self.runlr_app_log) self.connect(self.main_threads,QtCore.SIGNAL("app_start()"),self.app_start) self.connect(self.main_threads,QtCore.SIGNAL("app_end()"),self.app_end) self.scrollArea = QtGui.QScrollArea(self) self.scrollArea.setGeometry(QtCore.QRect(20, 160, 631, 241)) self.scrollArea.setWidgetResizable(True) self.scrollArea.setObjectName(_fromUtf8("scrollArea")) self.scrollAreaWidgetContents = QtGui.QWidget() self.checkBoxs_and_path=[] self.ui.pushButton_2.setDisabled(True) self.run_se=[] def closeEvent(self, event): # 關閉窗口的事件觸發消息框詢問,並設置消息框標題,提示信息,選擇按鍵 reply = QtGui.QMessageBox.question(self, u'信息', u"你確定退出", QtGui.QMessageBox.Yes, QtGui.QMessageBox.No) if reply == QtGui.QMessageBox.Yes: if self.main_threads.isRunning(): self.main_threads.exit() if self.run_se: for r in self.run_se: if r.isRunning(): r.terminate_thread() event.accept() else: event.ignore() def clear_checkboxs(self,layout): check_boxs=self.scrollAreaWidgetContents.findChildren(QtGui.QCheckBox) if layout != None and check_boxs: for c in check_boxs: c.setVisible(False) def runlr_app_log(self,text): self.ui.textEdit.append(text) def scan_lr_exe(self): lr_dir=unicode(self.ui.lineEdit_2.text()) if lr_dir and os.path.isdir(lr_dir): self.scan_lr_exe_thread=exe_lr.scan_lr_exe_threads(lr_dir) self.scan_lr_exe_thread.render() self.connect(self.scan_lr_exe_thread, QtCore.SIGNAL("runlr_app_log(QString)"),self.runlr_app_log) self.scan_lr_exe_thread.wait() return self.scan_lr_exe_thread.lr_exe_path else: return 0 def scan_files(self): root_dir=unicode(self.ui.lineEdit.text()) if os.path.isdir(root_dir): self.app_start() self.clear_checkboxs(self.scrollArea) self.scan_thread.render(root_dir) self.scan_thread.wait() l=self.scan_thread.check n=10 self.scrollAreaWidgetContents.setGeometry(QtCore.QRect(0, 0, 629, 239)) self.scrollAreaWidgetContents.setObjectName(_fromUtf8("scrollAreaWidgetContents")) for i in l: name= os.path.splitext(os.path.split(i)[-1])[-2]+" (%s)"%i self.checkBox = QtGui.QCheckBox(self.scrollAreaWidgetContents) self.checkBox.setVisible(True) self.checkBox.setGeometry(QtCore.QRect(10, n, 600, 16)) #self.checkBox.setObjectName(_fromUtf8("checkBox")) self.checkBox.setText(_translate("Frame", name, None)) n+=30 self.checkBoxs_and_path.append((self.checkBox,i)) self.scrollArea.setWidget(self.scrollAreaWidgetContents) #print self.checkBoxs else: self.ui.textEdit.append(u'請先選擇一個有效的目錄') self.app_end() def select_all_ckbox(self): all_checkbox_list=[c for c in self.scrollArea.findChildren(QtGui.QCheckBox)] if self.ui.checkBox_4.isChecked(): for c in all_checkbox_list: c.setChecked(True) else: for c in all_checkbox_list: c.setChecked(False) def get_scripter_folder(self): directory = QtGui.QFileDialog.getExistingDirectory(self, u"場景目錄") if directory: self.ui.lineEdit.setText(directory) def get_lr_folder(self): directory = QtGui.QFileDialog.getExistingDirectory(self, u"Loadrunner安裝目錄") if directory: self.ui.lineEdit_2.setText(directory) def start_run_lr(self): text=u"<p>現在要開始生產環境的場景壓測了,你確定要開始?</p>" \ u"<p>點擊'確定'開始生產環境的場景壓測,點擊'取消'就當什么事情都沒發生.</p>" msg=self.message_box(text) self.ui.textEdit.clear() lr=self.scan_lr_exe() checkbox_list=[c for c in self.scrollArea.findChildren(QtGui.QCheckBox) if c.isChecked()] if msg: self.app_start() if lr: if checkbox_list: self.run_se=[] for a in self.checkBoxs_and_path: if a[0] in checkbox_list: d=exe_lr.Worker(a[1],lr) self.connect(d, QtCore.SIGNAL("runlr_app_log(QString)"),self.runlr_app_log) self.run_se.append(d) self.main_threads.render(self.run_se) else: self.ui.textEdit.append(u'沒有找到合適的場景,請先點擊<掃描場景文件>進行查找,或者勾選一個場景進行壓測') self.app_end() else: self.ui.textEdit.append(u'無效的loadrunner安裝目錄或者沒有在loadrunner安裝目錄%s中找到Wlrun.exe執行文件'%lr) self.app_end() def message_box(self,text): msgBox = QtGui.QMessageBox(QtGui.QMessageBox.Warning, u"提示", text, QtGui.QMessageBox.NoButton, self) msgBox.addButton(u"確認", QtGui.QMessageBox.AcceptRole) msgBox.addButton(u"取消", QtGui.QMessageBox.RejectRole) if msgBox.exec_() == QtGui.QMessageBox.AcceptRole: return 1 else: return 0 def stop_lr(self): text=u"<p>現在場景們可能在生產上壓測,你確定終止?</p>" \ u"<p>點擊'確定'終止正在壓測的場景,點擊'取消'就當什么事情都沒發生.</p>" all_checked_thread=[c for c in self.scrollArea.findChildren(QtGui.QCheckBox) if c.isChecked()] if self.message_box(text): pass def change_ui(self,True_or_False): all_checkbox_list=[c for c in self.scrollArea.findChildren(QtGui.QCheckBox)] for a in all_checkbox_list: a.setDisabled(True_or_False) self.ui.checkBox_4.setDisabled(True_or_False) self.ui.lineEdit.setDisabled(True_or_False) self.ui.lineEdit_2.setDisabled(True_or_False) self.ui.pushButton.setDisabled(True_or_False) self.ui.pushButton_3.setDisabled(True_or_False) self.ui.pushButton_4.setDisabled(True_or_False) self.ui.pushButton_5.setDisabled(True_or_False) def app_start(self): self.ui.textEdit.clear() self.change_ui(True) def app_end(self): self.change_ui(False) if __name__ == "__main__": app = QtGui.QApplication(sys.argv) myapp = MainApp() myapp.show() sys.exit(app.exec_())
其中,此方法為掃描一個目錄,將相關結果取回,並生成checkbox
def scan_files(self): root_dir=unicode(self.ui.lineEdit.text()) if os.path.isdir(root_dir): self.app_start() self.clear_checkboxs(self.scrollArea) self.scan_thread.render(root_dir) self.scan_thread.wait() l=self.scan_thread.check n=10 self.scrollAreaWidgetContents.setGeometry(QtCore.QRect(0, 0, 629, 239)) self.scrollAreaWidgetContents.setObjectName(_fromUtf8("scrollAreaWidgetContents")) for i in l: name= os.path.splitext(os.path.split(i)[-1])[-2]+" (%s)"%i self.checkBox = QtGui.QCheckBox(self.scrollAreaWidgetContents) self.checkBox.setVisible(True) self.checkBox.setGeometry(QtCore.QRect(10, n, 600, 16)) #self.checkBox.setObjectName(_fromUtf8("checkBox")) self.checkBox.setText(_translate("Frame", name, None)) n+=30 self.checkBoxs_and_path.append((self.checkBox,i)) self.scrollArea.setWidget(self.scrollAreaWidgetContents) #print self.checkBoxs else: self.ui.textEdit.append(u'請先選擇一個有效的目錄') self.app_end()
其中此段是添加checkboxs。
for i in l: name= os.path.splitext(os.path.split(i)[-1])[-2]+" (%s)"%i self.checkBox = QtGui.QCheckBox(self.scrollAreaWidgetContents) self.checkBox.setVisible(True) self.checkBox.setGeometry(QtCore.QRect(10, n, 600, 16)) #self.checkBox.setObjectName(_fromUtf8("checkBox")) self.checkBox.setText(_translate("Frame", name, None)) n+=30 self.checkBoxs_and_path.append((self.checkBox,i)) self.scrollArea.setWidget(self.scrollAreaWidgetContents)
而self.clear_checkboxs(self.scrollArea)把前一次掃描的結果清除隱藏。self.checkBox.setVisible(True)將本次出現的checkbox設為可見。之前用checkBox.deleteLater()這個方法一直沒有起作用。