Вы должны установить QFormLayout в макете tab1, чтобы исключить следующее:
self.p1_vertical.addLayout(form)
и добавляет:
self.vbox.addLayout(form)
Хотя для лучшей организации я предпочитаю создавать новые классы:
from __future__ import division, print_function
import sys
from PyQt4 import QtGui, QtCore
class DataSelectionWidget(QtGui.QWidget):
def __init__(self, parent=None):
super(DataSelectionWidget, self).__init__(parent)
self.btn_cat = QtGui.QPushButton("Select category")
self.btn_cat.clicked.connect(self.getcat)
self.le3 = QtGui.QLineEdit(readOnly=True)
flay = QtGui.QFormLayout(self)
flay.addRow(self.btn_cat, self.le3)
# selected dir label
self.lbl_dir = QtGui.QLabel('Data directory not selected')
flay.addRow(self.lbl_dir)
# button label for datadir
btn_dir = QtGui.QPushButton('Browse...', self)
flay.addRow(btn_dir)
btn_dir.clicked.connect(self.get_dirname)
@QtCore.pyqtSlot()
def getcat(self):
cats = ['option 1', 'option 2']
category, ok = QtGui.QInputDialog.getItem(self, "select category",
"Option", cats, 0, False)
if ok:
self.le3.setText(category)
self.category = category
@QtCore.pyqtSlot()
def get_dirname(self):
print('yes')
class ToolsWidget(QtGui.QWidget):
def __init__(self, parent=None):
super(ToolsWidget, self).__init__(parent)
lay = QtGui.QVBoxLayout(self)
self.lblrun = QtGui.QLabel('Run')
lay.addWidget(self.lblrun)
# button for run
btn_run = QtGui.QPushButton('Run', self)
lay.addWidget(btn_run)
btn_run.clicked.connect(self.run)
@QtCore.pyqtSlot()
def run(self):
print('yes')
class Tester(QtGui.QWidget):
def __init__(self, parent=None):
# create GUI
super(Tester, self).__init__(parent)
self.setWindowTitle('Data tool')
# window dimensions
self.resize(300, 75)
tab1 = DataSelectionWidget()
tab2 = ToolsWidget()
# tabbing on
tab_widget = QtGui.QTabWidget()
tab_widget.addTab(tab1, "Data selection")
tab_widget.addTab(tab2, "Tools")
lay = QtGui.QVBoxLayout(self)
lay.addWidget(tab_widgetn)
if __name__ == "__main__":
app = QtGui.QApplication(sys.argv)
gui = Tester()
gui.show()
sys.exit(app.exec_())
Оценка была бы ближе к
(sizeof(A) + sizeof(B) + ELEMENT_OVERHEAD) * N + CONTAINER_OVERHEAD
Существуют издержки для каждого элемента, который Вы добавляете, и существуют также фиксированные издержки для поддержания структуры данных, используемой для структуры данных, хранящей карту. Это обычно - двоичное дерево, такое как Красно-черное Дерево. Например, в C++ GCC реализация STL ELEMENT_OVERHEAD
был бы sizeof(_Rb_tree_node_base)
и CONTAINER_OVERHEAD
был бы sizeof(_Rb_tree)
. Вышеупомянутому числу необходимо также добавить издержки структур управления памятью, используемых для хранения элементов карты.
Вероятно, легче прийти к оценке путем измерения потребления памяти кода для различного большого количества.
Если Вы действительно хотите знать объем потребляемой памяти во время выполнения, используйте пользовательское средство выделения и передайте его в при создании карты. См. книгу Josuttis и эту страницу его (для пользовательского средства выделения).
Возможно, легче попросить верхнюю границу?
Верхняя граница будет зависеть от точной реализации (например, особая разновидность используемого сбалансированного дерева). Возможно, можно ли сказать нам, почему Вам нужна эта информация, таким образом, мы можем помочь лучше?
Вы могли использовать MemTrack Curtis Bartley. Это - средство выделения памяти, которое заменяет по умолчанию и может разыскать использование памяти к типу выделения.
Пример вывода:
-----------------------
Memory Usage Statistics
-----------------------
allocated type blocks bytes
-------------- ------ -----
struct FHRDocPath::IndexedRec 11031 13.7% 2756600 45.8%
class FHRDocPath 10734 13.3% 772848 12.8%
class FHRDocElemPropLst 13132 16.3% 420224 7.0%
struct FHRDocVDict::IndexedRec 3595 4.5% 370336 6.2%
struct FHRDocMDict::IndexedRec 13368 16.6% 208200 3.5%
class FHRDocObject * 36 0.0% 172836 2.9%
struct FHRDocData::IndexedRec 890 1.1% 159880 2.7%
struct FHRDocLineTable::IndexedRec 408 0.5% 152824 2.5%
struct FHRDocMList::IndexedRec 2656 3.3% 119168 2.0%
class FHRDocMList 1964 2.4% 62848 1.0%
class FHRDocVMpObj 2096 2.6% 58688 1.0%
class FHRDocProcessColor 1259 1.6% 50360 0.8%
struct FHRDocTextBlok::IndexedRec 680 0.8% 48756 0.8%
class FHRDocUString 1800 2.2% 43200 0.7%
class FHRDocGroup 684 0.8% 41040 0.7%
class FHRDocObject * (__cdecl*)(void) 36 0.0% 39928 0.7%
class FHRDocXform 516 0.6% 35088 0.6%
class FHRDocTextColumn 403 0.5% 33852 0.6%
class FHRDocTString 407 0.5% 29304 0.5%
struct FHRDocUString::IndexedRec 1800 2.2% 27904 0.5%
Формула больше похожа:
(sizeof(A) + sizeof(B) + factor) * N
где фактор на запись наверху. Карты C++ обычно реализуются как красно-черные деревья. Это двоичные деревья, таким образом, будет по крайней мере два указателя для слева/справа узлы. Также будет некоторый материал реализации - вероятно, родительский указатель и "цветной" индикатор, таким образом, фактор сможет быть чем-то как
(sizeof( RBNode *) * 3 + 1) / 2
Однако все это является очень зависящим от реализации - для обнаружения наверняка, что действительно необходимо исследовать код на собственную реализацию библиотеки.
Размер карты действительно зависит от реализации карты. У Вас могли бы быть различные размеры на различных компиляторах/платформах, в зависимости от которой реализации STL они обеспечивают.
Почему Вам нужен этот размер?