Найти - Пользователи
Полная версия: PyQt - пару вопросов
Начало » GUI » PyQt - пару вопросов
1 2 3 4
aliens
вот, что код того, что сделал с 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))

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

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

Upd: посмотрел что там выдал QtDesigner - ну его нафиг, скажу ещё раз, или же им просто надо уметь пользоваться. Там с лэйаутами не всё ОК:)
aliens
poltergeist
понятно :) поищу,может там найду,если нет, придется ручками (
well
Люди, а кто-нибудь пробовал QtCore.QThread юзать? Можно маленький пример, в котором будет запущена какая-нибудь функция в фоне.
aliens
poltergeist
Qdevelop оказался нормальным, просто у меня урки кривоваты были :)
poltergeist
wellДумаю толку от этого мало будет, в одно время будет выполняться только один поток питонского кода, как и с модулем threads.
well
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
poltergeist
Сам если честно пытаюсь всячески обходить многопоточность в сторону многозадачности, поэтому с потоками в питоне не работал вплотную.

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

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), т.к. не сталкивался на практике.
well
Всем привет. Есть вопросик: никто не сталкивался с CalendarWidget? Можете показать, как вызвать календарик в отдельном окне при нажатии кнопки, а потом считать дату, которая была там выбрана?
poltergeist
Я как раз так и делал, пример покажу, но завтра, а идея такова: наследуем класс QDialog, создаём там при инициализации сам календарь и пару кнопок, на одну кнопку вешаем self.reject (кнопка Cancel), на другую вешаем self.accept (кнопка OK), также в этом классе надо переопределить метод exec_(), унаследованный от QDialog, в котором возвратить в случаё нажатия кнопки OK значение в календаре, в противном случае вернуть None. А чтобы было всё красиво, в этом же классе делается статический метод, например MyCalendarClass.getDate(), в котором всё и происходит (создание, вызов диалога и обработка результата) и в основном коде создавать ничего не придётся.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB