表格设置:
QSplitter
(在图像上突出显示)包含QTreeWidget
(左)和QTableWidget
(右):
QSplitter 中这两个小部件的非默认属性:
QTreeWidget
最小尺寸/宽度 = 150
QTableWidget
最小尺寸 / 宽度 = 300
尺寸策略 / 水平拉伸 = 1
基本上,上面的设置指定了这两个组件的最小宽度,这QTableWidget
就是在表单调整大小期间更改其宽度的宽度。
右侧的按钮位于QVBoxLayout
并且其大小是固定的。
问题:
当调整表单QTreeWidget
的宽度时,从最小 150 到未知的 256,然后才QTableWidget
开始增长,而我预计QTreeWidget
宽度根本不会增长,因为QTableWidget
水平拉伸设置为 1。
请注意,这与 无关QSplitter
,因为当我将这两个小部件放入时也会发生同样的情况QHBoxLayout
。
更新:
将最大尺寸/宽度设置QTreeWidget
为 150(与最小尺寸/宽度相同)以避免调整此小部件的大小,结果如下:
QTreeWidget
现在固定为 150,但是当调整窗口大小时,两个小部件之间会出现空白。这个差距增长到256-150=106,然后QTableWidget
开始扩大。
基本上结果是相似的,但是现在占据的这个时间区域QTreeWidget
专门用于这个空白间隙。
我开始觉得这可能是 Qt 的错误。
技术信息:
我已经安装了 python 2.5 和 PyQt 4.8.6。操作系统 - Windows Xp Sp2。我使用以下代码来填充 TreeWidget:
def updateTreeWidget(self, widget, results):
""" Updates the widget with given results """
widget.clear()
for item in results:
temp = QtGui.QTreeWidgetItem()
j = 0
for elem in item:
temp.setText(j , str(elem))
j += 1
widget.addTopLevelItem(temp)
for column in range(widget.columnCount()):
widget.resizeColumnToContents(column)
Run Code Online (Sandbox Code Playgroud)
它会在第二次使用时导致崩溃。如果我注释掉以下几行之一:
widget.addTopLevelItem(temp)
Run Code Online (Sandbox Code Playgroud)
或者
widget.clear()
Run Code Online (Sandbox Code Playgroud)
它可以毫无问题地工作。
我每 60 秒调用一次线程中的函数。这是 MyThread 类的定义。
class MyThread(threading.Thread):
def __init__(self, db, widget, function, script, parameter):
threading.Thread.__init__(self)
self.db = db
self.function = function
self.script = script
self.parameter …
Run Code Online (Sandbox Code Playgroud) QTreeWidget上的信号itemChecked和itemUncheсked在哪里?
Qt Signals: (quote from PyQt4 QTreeWidget documentation page)
void currentItemChanged (QTreeWidgetItem *,QTreeWidgetItem *)
void itemActivated (QTreeWidgetItem *,int)
void itemChanged (QTreeWidgetItem *,int)
void itemClicked (QTreeWidgetItem *,int)
void itemCollapsed (QTreeWidgetItem *)
void itemDoubleClicked (QTreeWidgetItem *,int)
void itemEntered (QTreeWidgetItem *,int)
void itemExpanded (QTreeWidgetItem *)
void itemPressed (QTreeWidgetItem *,int)
void itemSelectionChanged ()
Run Code Online (Sandbox Code Playgroud)
目前我解决了这个问题:
self.treeWidget.itemClicked.connect (self.handle)
def handle (item, column):
print 'emitted!', item.text(column)
if item.checkState(column) == QtCore.Qt.Checked:
# there are a lot of my functions inside which work with item data
self.handleChecked(item, column) …
Run Code Online (Sandbox Code Playgroud) 我想QTreeWidget
按alpha_numeric
专栏排序.
更新:
按照ekhumoro的例子,我重新实现了QTreeWidgetItem
__lt__
使用所需自然排序的方法.
相关代码:
class TreeWidgetItem(QtGui.QTreeWidgetItem):
def __lt__(self, other):
column = self.treeWidget().sortColumn()
key1 = self.text(column)
key2 = other.text(column)
return self.natural_sort_key(key1) < self.natural_sort_key(key2)
@staticmethod
def natural_sort_key(key):
regex = '(\d*\.\d+|\d+)'
parts = re.split(regex, key)
return tuple((e if i % 2 == 0 else float(e)) for i, e in enumerate(parts))
Run Code Online (Sandbox Code Playgroud)
更新完整的工作示例:
import sys
import re
from PySide import QtGui, QtCore
data = [
{"name": "Apple", "alpha_numeric": "11"},
{"name": "Apple", "alpha_numeric": "125b"},
{"name": …
Run Code Online (Sandbox Code Playgroud) 我基本上有这段代码来拦截某些QTreeWidget
事件。
MyWidget :: MyWidget ()
{
m_tree = new QTreeWidget ();
// ...
m_tree -> installEventFilter (this);
}
bool MyWidget :: eventFilter (QObject * obj, QEvent * e)
{
if (m_tree != obj)
return QWidget :: eventFilter (obj, e);
qDebug () << e -> type ();
switch (e -> type ())
{
case QEvent :: MouseButtonPress:
case QEvent :: MouseButtonRelease:
case QEvent :: MouseMove:
case QEvent :: Leave:
qDebug () << "GOT EM";
break;
};
// ...
} …
Run Code Online (Sandbox Code Playgroud) 如何在QTreeWidget中创建子项目?
我能够创建顶级项目(在下面列出),但仍然在寻找子项目.
PyQt-> 5.6
Python-> 3.5
Spyder-> 3.0.2
import sys
from PyQt5.QtWidgets import QTreeWidget, QTreeWidgetItem, QApplication, QWidget
if __name__ == '__main__':
app = 0
if QApplication.instance() != None:
app = QApplication.instance()
else:
app = QApplication(sys.argv)
l1 = QTreeWidgetItem([ "String A", "String B", "String C" ])
l2 = QTreeWidgetItem([ "String AA", "String BB", "String CC" ])
w = QWidget()
w.resize(510,210)
tw = QTreeWidget(w)
tw.resize(500,200)
tw.setColumnCount(3)
tw.setHeaderLabels(["Column 1", "Column 2", "Column 3"])
tw.addTopLevelItem(l1)
tw.addTopLevelItem(l2)
w.show()
app.exec_()
Run Code Online (Sandbox Code Playgroud) 我有一个文件,其中列出了绝对文件路径,每行1个.列出的文件是有序的,因此例如/Documents/
dir中的所有文件将在文件中彼此之后列出.
我想要做的是将所有这些文件QTreeWidget
放在一个漂亮的分层结构中,就像普通的文件系统一样.我如何从我的绝对路径文件中做到这一点?
这就是我对此进行编码的程度:
QFile file(FILENAME_ENCRYPTED);
QString line;
QDir dir;
QTreeWidgetItem *item;
if (file.open(QIODevice::ReadOnly)) {
QTextStream stream( &file );
do {
line = stream.readLine();
if (!line.isNull()) {
dir = QDir(line);
item = new QTreeWidgetItem();
item->setText(0, dir.dirName());
this->ui->treeWidget->addTopLevelItem(item);
}
} while (!line.isNull());
}
file.close();
Run Code Online (Sandbox Code Playgroud)
这工作正常,但它只列出了彼此之后的所有文件名.我想我必须做一些递归函数,但递归不是我最好的朋友,我更喜欢迭代!有人能给我一个正确的方向吗?:)
我QTreeWidgetItem
添加了一个QTreeWidget
:
QTreeWidgetItem* item = new QTreeWidgetItem(ui->trwPairs);
item->setFlags(item->flags() | Qt::ItemIsEditable);
Run Code Online (Sandbox Code Playgroud)
如果项目已编辑,我想对新值进行一些检查:
Pairs::Pairs(QWidget *parent) :
QWidget(parent),
ui(new Ui::Pairs)
{
ui->setupUi(this);
connect(this->ui->trwPairs, SIGNAL(itemChanged(QTreeWidgetItem*,int)), this, SLOT(Validate(QTreeWidgetItem*,int)));
}
void Pairs::Validate(QTreeWidgetItem* item, int column)
{
if (item->text(column).toInt() < 1)
{
QMessageBox::critical(this, "Error", QString("Node ID ") + item->text(column) + " is invalid.");
ui->trwPairs->editItem(item, column);
}
}
Run Code Online (Sandbox Code Playgroud)
当然,如果它小于1,它会捕获它,并给我消息框.但是,打印到cerr
is edit: editing failed
并且项目不处于编辑模式.我错过了什么?
我将一个QTreeWidget子类化,将其dragDropMode设置为InternalMove并使用自定义项填充它,其中一些可以被拖动,其他可以接受丢弃.用户可以按预期在树周围移动项目.但我需要通知项目顺序的变化并做出适当的反应.不幸的是,没有与我可以连接的树内物品移动相关的信号.
我尝试获取QTreeWidget的底层模型()的句柄,然后连接到其rowsMoved信号,但在内部移动期间似乎没有发出.
我重新实现了QTreeWidget的dropEvent(),但没有办法确定那里的目标行索引.
该dropMimeData()事件不会被调用在所有的内部动作,显然.
我可以尝试其他任何方法吗?谢谢.
我有一个基于 QTreeWidget 的简单类。在某些情况下(当其中一列的值更新时),我需要重新绘制它。我有一个函数,当我需要更新我的小部件时调用:
void TreeWidget::updated()
{
/* some actions with cells */
/* here need to repaint widget */
this->update();
/* also I'm tried this->repaint(); */
}
Run Code Online (Sandbox Code Playgroud)
但行this->update();
(或this->repaint();
) 没有给出任何结果。仅当我单击小部件时才重新绘制它。
那么我该如何重新绘制我的小部件呢?
qtreewidget ×10
qt ×8
c++ ×4
pyqt ×4
python ×3
crash ×1
pyqt4 ×1
pyqt5 ×1
pyside ×1
qmouseevent ×1
qt-designer ×1
qt-events ×1
qt4 ×1
qt5 ×1
qtablewidget ×1
qwidget ×1
recursion ×1
sorting ×1