- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
首先,我对 python 比较陌生,对 PyQt 也很陌生。我正在迈出面向对象编程的第一步,并且一直在查看在线教程,但我陷入了多重继承问题。
我有一个名为 CreateTable() 的类,其目的是在我的应用程序窗口中创建一个 QTableWidget,当单击一行时,它会打开一个上下文菜单,然后您可以选择用于绘制所选行的选项。其中图形选项连接到另一个类 Plotter()。
我的问题是 CreateTable 需要从 PyQt 继承 QTableWidget 和我的 MainWindow 类,因为我需要引用布局变量才能将我的图形嵌入到我的应用程序窗口中。
我尝试继承的代码如下,大量借用自此处:How does Python's super() work with multiple inheritance?
class QTable(QTableWidget):
def __init__(self):
super(QTable, self).__init__()
class PassMain(MainWindow):
def __init__(self):
super(PassMain, self).__init__()
class PassMainTable(PassMain, QTable):
def __init__(self):
super(PassMainTable, self).__init__()
主要问题是当我尝试将图形放置在主窗口布局中时。
self.vboxRight.addWidget(self.Graph)
这是我用于创建表和调用绘图仪的代码
class CreateTable(PassMainTable): #QTableWidget
def __init__(self, Data, row, col, colHeaders, rowHeaders): #Index, ColumnHeaders
super(CreateTable, self).__init__()
self.setSelectionBehavior(self.SelectRows)
print("Start initialization")
self.ColHeader = colHeaders
self.setRowCount(row)
self.setColumnCount(col)
self.data = Data
self.setHorizontalHeaderLabels(colHeaders)
print("Right before for loop")
n = len(Data)
m = len(colHeaders)
for i in range(n):
DataValues = self.data.iloc[i,:]
print("values are {}".format(DataValues))
#m = len(values)
ConvertedVals = pd.to_numeric(DataValues)
ValList = DataValues.values.tolist()
print(ValList)
for j in range(0,m):
self.item = QTableWidgetItem(str(round(ValList[j],5)))
#print("{}, {}".format(i, j))
self.setItem(i,j, self.item)
def contextMenuEvent(self, event):
menu = QMenu(self)
graphAction = menu.addAction("Graph")
compareAction = menu.addAction("Compare")
scatterAction = menu.addAction("Plot types")
aboutAction = menu.addAction("about")
quitAction = menu.addAction("quit")
printAction = menu.addAction("Print Row")
action = menu.exec_(self.mapToGlobal(event.pos()))
if action == quitAction:
qApp.quit()
elif action == printAction:
self.selected = self.selectedItems()
n = len(self.selected)
print("n is {}".format(n))
for i in range(n):
self.selected[i] = str(self.selected[i].text())
for i in range(n):
self.selected[i] = float(self.selected[i])
print(self.selected)
elif action == graphAction:
self.selected = self.selectedItems()
n = len(self.selected)
for i in range(n):
self.selected[i] = str(self.selected[i].text())
for i in range(n):
self.selected[i] = float(self.selected[i])
print("right before plotter called")
self.Graph = Plotter(self.selected, self.ColHeader)
self.vboxRight.addWidget(self.Graph)
else:
print("u clicked something other than quit")
更糟糕的是,PyQt 将我的所有错误捕获为异常,因此我得到的所有错误都是“进程已完成,退出代码 1”
如果您需要进一步引用我的完整代码,我在此处提供了链接:https://github.com/Silvuurleaf/Data-Analysis-and-Visualization-GUI/blob/master/Plotter3.1.py
谢谢你们,我感谢你们能给我的任何帮助。
最佳答案
为了共享数据,不需要继承小部件,只需使用信号,这是 PyQt 中异步共享数据的自然方式。例如,在您的情况下,我们将创建一个名为 dataSignal
的信号,根据您想要使用变量 self.selected
、self.selected 的代码观察到的情况。 ColHeader
,第一个是 list
类型,第二个是 numpy.ndarray
,因此我们将构建信号:
class CreateTable(QTableWidget): #QTableWidget
dataSignal = pyqtSignal(list, np.ndarray)
def __init__(self, Data, row, col, colHeaders, rowHeaders): #Index, ColumnHeaders
super(CreateTable, self).__init__()
self.setSelectionBehavior(self.SelectRows)
print("Start initialization")
self.ColHeader = colHeaders
self.setRowCount(row)
self.setColumnCount(col)
self.data = Data
self.setHorizontalHeaderLabels(colHeaders)
print("Right before for loop")
n = len(Data)
m = len(colHeaders)
for i in range(n):
DataValues = self.data.iloc[i,:]
print("values are {}".format(DataValues))
#m = len(values)
ConvertedVals = pd.to_numeric(DataValues)
ValList = DataValues.values.tolist()
print(ValList)
for j in range(0,m):
self.item = QTableWidgetItem(str(round(ValList[j],5)))
#print("{}, {}".format(i, j))
self.setItem(i,j, self.item)
def contextMenuEvent(self, event):
menu = QMenu(self)
graphAction = menu.addAction("Graph")
compareAction = menu.addAction("Compare")
scatterAction = menu.addAction("Plot types")
aboutAction = menu.addAction("about")
quitAction = menu.addAction("quit")
printAction = menu.addAction("Print Row")
action = menu.exec_(self.mapToGlobal(event.pos()))
if action == quitAction:
qApp.quit()
elif action == printAction:
self.selected = self.selectedItems()
n = len(self.selected)
print("n is {}".format(n))
for i in range(n):
self.selected[i] = str(self.selected[i].text())
for i in range(n):
self.selected[i] = float(self.selected[i])
print(self.selected)
elif action == graphAction:
self.selected = self.selectedItems()
n = len(self.selected)
for i in range(n):
self.selected[i] = str(self.selected[i].text())
for i in range(n):
self.selected[i] = float(self.selected[i])
print("right before plotter called")
print(type(self.selected), type(self.ColHeader))
self.dataSignal.emit(self.selected, self.ColHeader)
else:
print("u clicked something other than quit")
然后在 MainWindow 类中我们创建一个插槽,在其中创建 Plotter 对象并将其添加到布局中。
def dataPlotter(self, x_data,y_data):
self.Graph = Plotter(x_data, y_data)
self.vboxRightBottom.addWidget(self.Graph)
为此,我们在创建 CreateTable
对象时连接信号:
self.Table = CreateTable(self.BaseStats, row, col, colHeaders, rowHeaders)
self.Table.dataSignal.connect(self.dataPlotter)
self.vboxRightBottom.addWidget(self.Table)
完整代码为here 。
关于python - 如何继承 QTableWidget 和我的类 MainWindow?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45242591/
我做了我的研究,人们倾向于使用 ViewModel 来实现这一点,但我有点陷入其中。 我有一个 public ObservableCollection orderList { get; set; }
当用户更改主题时,我使用 mainWindow.webContents.send 更改 DOM 中的类。我还将它保存在商店中,在键 theme 下。 mainWindow.webContents.se
所以我有一个名为 MainWindow 的空主框架和一个 WelcomeWidget,它在程序启动时立即调用并加载到主框架中。然后我想要 WelcomeWidget 中的按钮 next_btn 调用
像a一样用slot和signal连接就对了 connect( ui->widget, SIGNAL( GetSquareParameters( int &, int &,int &,int &)),
我正在尝试构建一个桌面应用程序,使用 Electron 在 web View 中打开 gmail。在我的主文件中,我已经加载了这样的网址 mainWindow.loadURL("https://gma
在我的 (Py)Qt4 应用程序中,直到用户使用 command-tab 切换离开应用程序,然后使用 command-tabs 切换回它,主窗 Eloquent 会出现。 奇怪的是这个问题仅在双击启动
我有一个带有菜单的MainWindow,可以打开一个注册对话框。如何在注册后更新 MainWindow 中的 tableView? 这是我的 MainWindow 实现: MainWindow::Ma
我想使用 PyQt5 和 QtDesigner 开始一个新项目。首先,我只是复制了 PyQt4 中以前项目中的代码,并将其调整为 PyQt5 中的更改。因此,启动 Main Window 和更新应用程
我正在尝试制作一个包含 MainWindow.cpp 和一个 dialog1.cpp 的程序,我需要将一个字符串从我的对话框的 QLineEdit 传递到 MainWindow.cpp 中的一个函数。
我有一个使用 Qt Designer 制作的 PyQt5 MainWindow。 这个窗口应该抓取网站并在找到后在 TreeView 中列出抓取的链接。 每次抓取新链接时,我都可以创建一个模型 QSt
我理解 Static 和 Instance 的概念,但我很困惑,当我有一个只有 1 个实例的类时,我应该使用哪个实例,这是在我的应用程序开始时调用的实例 (=Application.Current .
我正在尝试将 MainWindow 的 DataContext 设置为其在 App.OnStartup 中的 ViewModel。我注意到这样做时,MainWindow() 构造函数被调用了两次,我看
是否可以将相对于 MainWindow 的点转换为相对于其子控件之一?例如,假设一个控件的左上角位于 500, 500 相对于 MainWindow 什么代码会将该数字转换为 (0, 0)?我希望解决
所以我按照以下网站上的指南来限制文本框可以接受的字符。 http://www.rhyous.com/2010/06/18/how-to-limit-or-prevent-characters-in-a
我目前正在使用 QT Creator 创建用于查看的 UI 文件,我是 QT 初学者。 有一部分我很好奇,我如何创建另一个类,比如 GraphicView,以便我可以将信号和槽发送到该类而不是主窗体?
我在 MainWindow.xaml.cs 中有这个: public partial class MainWindow : Window { public double _frameCount
我有用户控件,它有两个控件 标签 和 文本 block 并且在我的 MainWindow 中,我有一个 List
我有一个关于 Scope 的初学者问题。在 MainWindow 类中,我创建了用于数据绑定(bind)的 ModelView 类的实例,以及具有要显示的 Leaves 属性的 Cabbage 类的实
首先,在主窗口中看到这段代码 我创建了一个名为 RightPanel 的用户控件,并将其命名为 MainWindow.xaml rightPanel 例如,在用户
首先,在主窗口中看到这段代码 我创建了一个名为 RightPanel 的用户控件,并将其命名为 MainWindow.xaml rightPanel 例如,在用户
我是一名优秀的程序员,十分优秀!