我的工作是pyqt4,python3.4我想验证单元格中的文本在引入时是否是浮点数。我怎么做到这一点?
我有一个处于可编辑模式的 QTableWidget,其中用户输入整数,如何生成在此表中输入的数据列表以便对其执行操作,这是我的手动代码:
def dataframe_generation_from_table(self,table):
number_of_rows = table.rowCount()
number_of_columns = table.columnCount()
tmp_df = pd.DataFrame({ 'Date' : [] , str(self.final_lvl_of_analysis) :[], 'Value': []})
for i in range(0,number_of_rows):
for j in range(0,number_of_columns):
tmp_item = table.item(i,j)
tmp_df2 = pd.DataFrame( { 'Date' : [pd.to_datetime(table.horizontalHeaderItem(j).data())] , str(self.final_lvl_of_analysis) :[ str(table.verticalHeaderItem(i).data())], 'Value': [float(tmp_item.data(0))]})
print tmp_df2
tmp_df.update(tmp_df2, join = 'left', overwrite = False)
return tmp_df
Run Code Online (Sandbox Code Playgroud)
另外,我使用以下代码来生成 QTableWidget:
self.pd_table = QtGui.QTableWidget(self.groupBox_19)
self.pd_table.setObjectName(_fromUtf8("pd_table"))
self.pd_table.setColumnCount(0)
self.pd_table.setRowCount(0)
Run Code Online (Sandbox Code Playgroud)
我的规格是:pandas 0.18.1、PyQt 4 和 Python 2.7
我使用 QListWidget 通过使用 setItemWidget 设置自定义小部件来显示它们。像这样的东西:
QListWidget* listWidget = new QListWidget;
listWidget->setAcceptDrops(true);
listWidget->setDragDropMode(QAbstractItemView::InternalMove);
listWidget->setDragEnabled(true);
listWidget->setSelectionMode(QAbstractItemView::SingleSelection);
for ( int i = 0 ; i < 50 ; ++i )
{
ItemWidget* item = new ItemWidget;
QListWidgetItem* listItem = new QListWidgetItem;
listItem->setSizeHint(item->sizeHint());
listWidget->addItem(listItem);
listWidget->setItemWidget(listItem, item);
}
Run Code Online (Sandbox Code Playgroud)
ItemWidget 源自 QWidget,仅在布局中显示一些自定义数据,如下所示:
ItemWidget::ItemWidget()
{
QVBoxLayout* layout = new QVBoxLayout;
layout->setContentsMargins(0, 0, 0, 0);
layout->setSpacing(0);
QHBoxLayout* contentLayout = new QHBoxLayout;
contentLayout->setSizeConstraint(QLayout::SetFixedSize);
contentLayout->setSpacing(0);
contentLayout->addSpacing(5);
contentLayout->setContentsMargins(10, 20, 10, 20);
QLabel* iconLbl = new QLabel;
iconLbl->setPixmap(QPixmap(":/icon.png"));
iconLbl->setMaximumWidth(20);
contentLayout->addWidget(iconLbl, 0, Qt::AlignTop); …Run Code Online (Sandbox Code Playgroud) 我创建了一个 QTableWidget,在其中的一列中,我使用 setCellWidget 函数设置组合框 QComboBox。效果很好。
这就是我设置 qtablewidget 的方式
cb = QComboBox()
cb.addItems(["Java", "C#", "Python"])
qtablewidget.setCellWidget(row_number, column_number , cb )
Run Code Online (Sandbox Code Playgroud)
但现在当我迭代 QTableWidget 时,我无法弄清楚如何获取每行组合框的选定值?
我正在为我的工作建立一个数据库。我希望能够以类似于通过单击列标题对 Excel 中的元素进行排序的方式对元素进行排序。我正在使用 pandas 库,所以我计划用它进行排序,但我的主要问题是有没有办法在 QTableWidget 中单击标题时运行代码?或者这是不可能的?
我有一个 Qtablewidget,如下所示。我想从表中复制多个单元格并粘贴到同一个表中的其他行中。
到目前为止,我可以在单个单元上执行相同的操作,但是有没有办法可以同时执行多个单元?
另外,如果可能的话,复制多行并将其粘贴到下面的同一个表中?
我尝试查看 SO 中的一些答案,但没有在 PyQt5 中实现它。
提前致谢。
示例代码(由 QtDesigner 提供):
from PyQt5 import QtCore, QtGui, QtWidgets
class Ui_MainWindow(object):
def setupUi(self, MainWindow):
MainWindow.setObjectName("MainWindow")
MainWindow.resize(1048, 600)
self.centralwidget = QtWidgets.QWidget(MainWindow)
self.centralwidget.setObjectName("centralwidget")
self.tableWidget = QtWidgets.QTableWidget(self.centralwidget)
self.tableWidget.setGeometry(QtCore.QRect(40, 40, 861, 511))
self.tableWidget.setEditTriggers(QtWidgets.QAbstractItemView.AnyKeyPressed|QtWidgets.QAbstractItemView.DoubleClicked|QtWidgets.QAbstractItemView.EditKeyPressed)
self.tableWidget.setRowCount(5)
self.tableWidget.setColumnCount(5)
self.tableWidget.setObjectName("tableWidget")
item = QtWidgets.QTableWidgetItem()
self.tableWidget.setHorizontalHeaderItem(0, item)
item = QtWidgets.QTableWidgetItem()
self.tableWidget.setHorizontalHeaderItem(1, item)
item = QtWidgets.QTableWidgetItem()
self.tableWidget.setHorizontalHeaderItem(2, item)
item = QtWidgets.QTableWidgetItem()
self.tableWidget.setHorizontalHeaderItem(3, item)
item = QtWidgets.QTableWidgetItem()
self.tableWidget.setHorizontalHeaderItem(4, item)
item = QtWidgets.QTableWidgetItem()
self.tableWidget.setItem(0, 0, item)
item = QtWidgets.QTableWidgetItem()
self.tableWidget.setItem(0, 1, item)
item …Run Code Online (Sandbox Code Playgroud) 系统会提示用户一个文件对话框,并选择一个完整路径,然后将其放入父 QTableWidget 内的 QTableWidgetItem 单元格内。目前,当项目中的文本过多且可以显示的内容过多时,它将首先显示左侧部分。
如果完整路径是C:\Users\JohnDoe\Example_File1.txt它将显示: C:\Users\JohnDoe\Ex...
我希望用户能够在溢出截止发生之前首先看到正确的部分(文件基本名称),以便它会显示:
...Doe\Example_File1.txt
我尝试实现以下代码,该代码更改了对齐方式,但似乎没有按上述方式工作:
obj = self.QTable1 #A 10x3 table
for x in range(obj.rowCount()):
item = obj.item(x,2) #Change alignment for 3rd column (Where paths are stored)
item.setTextAlignment( QtCore.Qt.AlignRight)
Run Code Online (Sandbox Code Playgroud) 如何创建一个包含2个columnes的QTable小部件,在第一列中有一个QComboBox,在第二列中有一个QSpinBox,以便组合框获取表的所有空间,只有一个非常小的位置留给QSpinBox(用于2-3位数).
我创建了一个QLineEdit,设置一个验证器并使用以下代码将其放在表中:
ui->moneyTableWidget->setCellWidget(rowsNum, 1, newQLineEdit);
Run Code Online (Sandbox Code Playgroud)
然后,我有另一个类来操作表的数据,做一个列的每个值的总和.这是代码:
int Calculator::calculatePricesSum(QTableWidget &moneyTableWidget){
double total = 0;
QWidget *tmpLineEdit;
QString *tmpString;
for(int row=0; row<moneyTableWidget.rowCount(); row++){
tmpLineEdit = (QLineEdit*)moneyTableWidget.cellWidget(row,1);
tmpString = tmpLineEdit.text();
total += tmpString->toDouble();
}
return total;
}
Run Code Online (Sandbox Code Playgroud)
但是建筑失败并出现此错误:
/ home/testpec/src/nokia QT/MoneyTracker-build-simulator /../ MoneyTracker/calculator.cpp:11:错误:在分配时无法将'QLineEdit*'转换为'QWidget*'
为什么这个转换错误?
另一个子问题:将表作为参考传递可以节省内存吗?这可能是问题吗?我正在为诺基亚智能手机开发,我认为按价值传递对象是浪费内存......(对不起,如果是一个愚蠢的问题,但我对C++和所有指针的东西有点生疏......)
我需要将我的QTableWidget的第一列填充为:行:1,行:2 ...行:100,但排序不能按预期工作(数字).使用此代码排序工作正常,但我没有得到预期的文本:
for i in range(0, self.rows):
item = QtGui.QTableWidgetItem()
item.setData(Qt.DisplayRole, "Row: %s" %(i) )
item.setData(Qt.EditRole, i)
self.ui.tableWidget.setItem(i, 0, item)
Run Code Online (Sandbox Code Playgroud)
我得到:1,2,3,4 ......而不是Row:1,Row:2,Row:3 ...我期望EditRole将用于编辑目的(用于数字排序,它工作正常)但我还期望显示文本,因为它是使用DisplayRole设置的.我能以某种方式这样做,或者为了排序而编写函数是唯一的方法吗?