Уведомления

Группа в Telegram: @pythonsu

#1 Янв. 9, 2008 16:41:27

aliens
От:
Зарегистрирован: 2007-08-14
Сообщения: 135
Репутация: +  1  -
Профиль   Отправить e-mail  

PyQt - пару вопросов

вот, что код того, что сделал с QtDesigner

# -*- coding: utf-8 -*-

# Form implementation generated from reading ui file ‘main.ui’
#
# Created: Wed Jan 9 15:12:52 2008
# by: PyQt4 UI code generator 4.3.1
#
# WARNING! All changes made in this file will be lost!

from PyQt4 import QtCore, QtGui

class Ui_mainCHM(object):
def setupUi(self, mainCHM):
mainCHM.setObjectName(“mainCHM”)
mainCHM.resize(QtCore.QSize(QtCore.QRect(0,0,641,463).size()).expandedTo(mainCHM.minimumSizeHint()))

sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Preferred,QtGui.QSizePolicy.Preferred)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
sizePolicy.setHeightForWidth(mainCHM.sizePolicy().hasHeightForWidth())
mainCHM.setSizePolicy(sizePolicy)
mainCHM.setModal(True)

self.verticalLayout = QtGui.QWidget(mainCHM)
self.verticalLayout.setGeometry(QtCore.QRect(0,0,641,461))
self.verticalLayout.setObjectName(“verticalLayout”)

self.vboxlayout = QtGui.QVBoxLayout(self.verticalLayout)
self.vboxlayout.setObjectName(“vboxlayout”)

self.allTabs = QtGui.QTabWidget(self.verticalLayout)
self.allTabs.setObjectName(“allTabs”)

self.clients = QtGui.QWidget()
self.clients.setObjectName(“clients”)

self.clientsTable = QtGui.QTableWidget(self.clients)
self.clientsTable.setWindowModality(QtCore.Qt.NonModal)
self.clientsTable.setGeometry(QtCore.QRect(0,0,631,381))

sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Maximum,QtGui.QSizePolicy.Maximum)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
sizePolicy.setHeightForWidth(self.clientsTable.sizePolicy().hasHeightForWidth())
self.clientsTable.setSizePolicy(sizePolicy)
self.clientsTable.setAlternatingRowColors(True)
self.clientsTable.setShowGrid(True)
self.clientsTable.setSortingEnabled(True)
self.clientsTable.setObjectName(“clientsTable”)
self.allTabs.addTab(self.clients,“”)
self.vboxlayout.addWidget(self.allTabs)

self.hboxlayout = QtGui.QHBoxLayout()
self.hboxlayout.setObjectName(“hboxlayout”)

self.loadBut = QtGui.QPushButton(self.verticalLayout)
self.loadBut.setObjectName(“loadBut”)
self.hboxlayout.addWidget(self.loadBut)

self.addBut = QtGui.QPushButton(self.verticalLayout)
self.addBut.setObjectName(“addBut”)
self.hboxlayout.addWidget(self.addBut)

self.delBut = QtGui.QPushButton(self.verticalLayout)
self.delBut.setObjectName(“delBut”)
self.hboxlayout.addWidget(self.delBut)

spacerItem = QtGui.QSpacerItem(40,20,QtGui.QSizePolicy.Expanding,QtGui.QSizePolicy.Minimum)
self.hboxlayout.addItem(spacerItem)

self.exitBut = QtGui.QPushButton(self.verticalLayout)
self.exitBut.setObjectName(“exitBut”)
self.hboxlayout.addWidget(self.exitBut)
self.vboxlayout.addLayout(self.hboxlayout)

self.retranslateUi(mainCHM)
self.allTabs.setCurrentIndex(0)
QtCore.QObject.connect(self.exitBut,QtCore.SIGNAL(“clicked()”),mainCHM.close)
QtCore.QMetaObject.connectSlotsByName(mainCHM)

def retranslateUi(self, mainCHM):
mainCHM.setWindowTitle(QtGui.QApplication.translate(“mainCHM”, “mainCHMs”, None, QtGui.QApplication.UnicodeUTF8))
self.clientsTable.setRowCount(0)
self.clientsTable.clear()
self.clientsTable.setColumnCount(7)
self.clientsTable.setRowCount(0)

headerItem = QtGui.QTableWidgetItem()
headerItem.setText(QtGui.QApplication.translate(“mainCHM”, “Улица”, None, QtGui.QApplication.UnicodeUTF8))
self.clientsTable.setHorizontalHeaderItem(0,headerItem)

headerItem1 = QtGui.QTableWidgetItem()
headerItem1.setText(QtGui.QApplication.translate(“mainCHM”, “Дом”, None, QtGui.QApplication.UnicodeUTF8))
self.clientsTable.setHorizontalHeaderItem(1,headerItem1)

headerItem2 = QtGui.QTableWidgetItem()
headerItem2.setText(QtGui.QApplication.translate(“mainCHM”, “Кв.”, None, QtGui.QApplication.UnicodeUTF8))
self.clientsTable.setHorizontalHeaderItem(2,headerItem2)

headerItem3 = QtGui.QTableWidgetItem()
headerItem3.setText(QtGui.QApplication.translate(“mainCHM”, “IP”, None, QtGui.QApplication.UnicodeUTF8))
self.clientsTable.setHorizontalHeaderItem(3,headerItem3)

headerItem4 = QtGui.QTableWidgetItem()
headerItem4.setText(QtGui.QApplication.translate(“mainCHM”, “Тел.”, None, QtGui.QApplication.UnicodeUTF8))
self.clientsTable.setHorizontalHeaderItem(4,headerItem4)

headerItem5 = QtGui.QTableWidgetItem()
headerItem5.setText(QtGui.QApplication.translate(“mainCHM”, “ФИО”, None, QtGui.QApplication.UnicodeUTF8))
self.clientsTable.setHorizontalHeaderItem(5,headerItem5)

headerItem6 = QtGui.QTableWidgetItem()
headerItem6.setText(QtGui.QApplication.translate(“mainCHM”, “Прим.”, None, QtGui.QApplication.UnicodeUTF8))
self.clientsTable.setHorizontalHeaderItem(6,headerItem6)
self.allTabs.setTabText(self.allTabs.indexOf(self.clients), QtGui.QApplication.translate(“mainCHM”, “Клиенты”, None, QtGui.QApplication.UnicodeUTF8))
self.loadBut.setText(QtGui.QApplication.translate(“mainCHM”, “Загрузить”, None, QtGui.QApplication.UnicodeUTF8))
self.addBut.setText(QtGui.QApplication.translate(“mainCHM”, “Добавить”, None, QtGui.QApplication.UnicodeUTF8))
self.delBut.setText(QtGui.QApplication.translate(“mainCHM”, “Удалить”, None, QtGui.QApplication.UnicodeUTF8))
self.exitBut.setText(QtGui.QApplication.translate(“mainCHM”, “Выход”, None, QtGui.QApplication.UnicodeUTF8))



Офлайн

#2 Янв. 9, 2008 16:52:16

poltergeist
От:
Зарегистрирован: 2007-02-28
Сообщения: 522
Репутация: +  0  -
Профиль   Отправить e-mail  

PyQt - пару вопросов

Копать надо в лэйауты. Это если нужно всё стандартно, и этого всегда должно хватать.

Но, если надо что-то нестандартное сделать, то вот: при изменении размера окна, изменением размеров его дочерних виджетов занимается лэйаут. Лэйаут по разному подгоняет размеры разных виджетов, это зависит от свойства виджета “sizePolicy”, которое для разных виджетов разное. Чтобы заставить виджет вести себя в лэйауте не стандартно, надо поменять его свойство “sizePolicy” соответствующим методом “setSizePolicy()”. Но менять это нужно в редких случаях, просто надо понимать как всё работает.

Upd: посмотрел что там выдал QtDesigner - ну его нафиг, скажу ещё раз, или же им просто надо уметь пользоваться. Там с лэйаутами не всё ОК:)



Отредактировано (Янв. 9, 2008 17:08:37)

Офлайн

#3 Янв. 9, 2008 17:54:16

aliens
От:
Зарегистрирован: 2007-08-14
Сообщения: 135
Репутация: +  1  -
Профиль   Отправить e-mail  

PyQt - пару вопросов

poltergeist
понятно :) поищу,может там найду,если нет, придется ручками (



Офлайн

#4 Янв. 9, 2008 20:24:25

well
От:
Зарегистрирован: 2006-11-20
Сообщения: 163
Репутация: +  0  -
Профиль   Отправить e-mail  

PyQt - пару вопросов

Люди, а кто-нибудь пробовал QtCore.QThread юзать? Можно маленький пример, в котором будет запущена какая-нибудь функция в фоне.



Офлайн

#5 Янв. 11, 2008 04:11:22

aliens
От:
Зарегистрирован: 2007-08-14
Сообщения: 135
Репутация: +  1  -
Профиль   Отправить e-mail  

PyQt - пару вопросов

poltergeist
Qdevelop оказался нормальным, просто у меня урки кривоваты были :)



Офлайн

#6 Янв. 11, 2008 12:57:06

poltergeist
От:
Зарегистрирован: 2007-02-28
Сообщения: 522
Репутация: +  0  -
Профиль   Отправить e-mail  

PyQt - пару вопросов

wellДумаю толку от этого мало будет, в одно время будет выполняться только один поток питонского кода, как и с модулем threads.



Офлайн

#7 Янв. 12, 2008 14:18:27

well
От:
Зарегистрирован: 2006-11-20
Сообщения: 163
Репутация: +  0  -
Профиль   Отправить e-mail  

PyQt - пару вопросов

poltergeist
wellДумаю толку от этого мало будет, в одно время будет выполняться только один поток питонского кода, как и с модулем threads.
Просто у меня возникла одна проблема, с которой не могу справиться: запускаю через threading.Thread несколько заданий и мне надо, чтобы progressBar для каждого менялся. Но при попытке сделать progressBar.setValue (value) в потоке программа вываливается с ошибкой Win32. Я думал, что это из-за того, что я использую threading.Thread, а не QtCore.QThread. Вот пример кода:

import …
class otherWork ():
def startRadmin (self, hostName, progressBar):
progresBar.setValue (10)
return hostName

class faceForm (QtGui.QMainWindow):
def __init__ (self):

self.work = otherWork ()
def oneDef (self): #Здесь я создаю отдельный поток (ниже)

startComm = threading.Thread (target = self.threadStart, args = )
startComm.start ()

def threadStart (self, command, hostName, progressBar, msg):
comRes = command (hostName, progressBar)
msg += comRes



Офлайн

#8 Янв. 12, 2008 16:46:52

poltergeist
От:
Зарегистрирован: 2007-02-28
Сообщения: 522
Репутация: +  0  -
Профиль   Отправить e-mail  

PyQt - пару вопросов

Сам если честно пытаюсь всячески обходить многопоточность в сторону многозадачности, поэтому с потоками в питоне не работал вплотную.

Так как вы не даёте простой пример:(, явно показывающий ошибку, приходится самому что-то варганить, получилось так:

from PyQt4 import QtCore, QtGui
import threading

class otherWork():
def startRadmin(self, progressBar): progressBar.setValue(10)

class MainForm(QtGui.QProgressBar):
def __init__ (self):
QtGui.QProgressBar.__init__(self)
#
self.work = otherWork()

def start(self): threading.Thread(target=self.threadTarget, args=).start()

def threadTarget(self, progressBar): self.work.startRadmin(progressBar)

app = QtGui.QApplication()
w = MainForm()
w.show()
w.start()
app.exec_()

Ошибок я не получил!, но и это не правильно!. В любом случае, в многопоточном приложении надо использовать объекты синхронизации, а в графическом приложении на Qt сам бог велел использовать архитектуру сигнал/слот, которая как говориться “ThreadSafe”, хотя не уверен до конца в её реализации на питоне (PyQt), т.к. не сталкивался на практике.



Офлайн

#9 Янв. 18, 2008 23:31:36

well
От:
Зарегистрирован: 2006-11-20
Сообщения: 163
Репутация: +  0  -
Профиль   Отправить e-mail  

PyQt - пару вопросов

Всем привет. Есть вопросик: никто не сталкивался с CalendarWidget? Можете показать, как вызвать календарик в отдельном окне при нажатии кнопки, а потом считать дату, которая была там выбрана?



Офлайн

#10 Янв. 20, 2008 10:26:45

poltergeist
От:
Зарегистрирован: 2007-02-28
Сообщения: 522
Репутация: +  0  -
Профиль   Отправить e-mail  

PyQt - пару вопросов

Я как раз так и делал, пример покажу, но завтра, а идея такова: наследуем класс QDialog, создаём там при инициализации сам календарь и пару кнопок, на одну кнопку вешаем self.reject (кнопка Cancel), на другую вешаем self.accept (кнопка OK), также в этом классе надо переопределить метод exec_(), унаследованный от QDialog, в котором возвратить в случаё нажатия кнопки OK значение в календаре, в противном случае вернуть None. А чтобы было всё красиво, в этом же классе делается статический метод, например MyCalendarClass.getDate(), в котором всё и происходит (создание, вызов диалога и обработка результата) и в основном коде создавать ничего не придётся.



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version