Форум сайта python.su
вот, что код того, что сделал с 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))
Офлайн
Копать надо в лэйауты. Это если нужно всё стандартно, и этого всегда должно хватать.
Но, если надо что-то нестандартное сделать, то вот: при изменении размера окна, изменением размеров его дочерних виджетов занимается лэйаут. Лэйаут по разному подгоняет размеры разных виджетов, это зависит от свойства виджета “sizePolicy”, которое для разных виджетов разное. Чтобы заставить виджет вести себя в лэйауте не стандартно, надо поменять его свойство “sizePolicy” соответствующим методом “setSizePolicy()”. Но менять это нужно в редких случаях, просто надо понимать как всё работает.
Upd: посмотрел что там выдал QtDesigner - ну его нафиг, скажу ещё раз, или же им просто надо уметь пользоваться. Там с лэйаутами не всё ОК:)
Отредактировано (Янв. 9, 2008 17:08:37)
Офлайн
poltergeist
понятно :) поищу,может там найду,если нет, придется ручками (
Офлайн
Люди, а кто-нибудь пробовал QtCore.QThread юзать? Можно маленький пример, в котором будет запущена какая-нибудь функция в фоне.
Офлайн
poltergeist
Qdevelop оказался нормальным, просто у меня урки кривоваты были :)
Офлайн
wellДумаю толку от этого мало будет, в одно время будет выполняться только один поток питонского кода, как и с модулем threads.
Офлайн
poltergeistПросто у меня возникла одна проблема, с которой не могу справиться: запускаю через threading.Thread несколько заданий и мне надо, чтобы progressBar для каждого менялся. Но при попытке сделать progressBar.setValue (value) в потоке программа вываливается с ошибкой Win32. Я думал, что это из-за того, что я использую threading.Thread, а не QtCore.QThread. Вот пример кода:
wellДумаю толку от этого мало будет, в одно время будет выполняться только один поток питонского кода, как и с модулем threads.
Офлайн
Сам если честно пытаюсь всячески обходить многопоточность в сторону многозадачности, поэтому с потоками в питоне не работал вплотную.
Так как вы не даёте простой пример:(, явно показывающий ошибку, приходится самому что-то варганить, получилось так:
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), т.к. не сталкивался на практике.
Офлайн
Всем привет. Есть вопросик: никто не сталкивался с CalendarWidget? Можете показать, как вызвать календарик в отдельном окне при нажатии кнопки, а потом считать дату, которая была там выбрана?
Офлайн
Я как раз так и делал, пример покажу, но завтра, а идея такова: наследуем класс QDialog, создаём там при инициализации сам календарь и пару кнопок, на одну кнопку вешаем self.reject (кнопка Cancel), на другую вешаем self.accept (кнопка OK), также в этом классе надо переопределить метод exec_(), унаследованный от QDialog, в котором возвратить в случаё нажатия кнопки OK значение в календаре, в противном случае вернуть None. А чтобы было всё красиво, в этом же классе делается статический метод, например MyCalendarClass.getDate(), в котором всё и происходит (создание, вызов диалога и обработка результата) и в основном коде создавать ничего не придётся.
Офлайн