首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >在QMainWindow中添加QWidget,它在PyQt中已经有一个中心小部件

在QMainWindow中添加QWidget,它在PyQt中已经有一个中心小部件
EN

Stack Overflow用户
提问于 2021-03-15 18:01:31
回答 1查看 172关注 0票数 0

我正在用PyQt开发一个图形用户界面应用程序。

对于按钮,我使用了QWidget,对于QSqlTable,我使用了QMainWindow。

我知道我可以通过在QWidget中添加setCentralwidget来添加QMainWindow。但是为了显示表格,我需要表格作为中心小部件。

两个都可以单独使用,但我无法同时拥有这两个。

我的代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import sys
from PyQt5 import QtCore, QtWidgets
from PyQt5.QtWidgets import QVBoxLayout, QGroupBox, QGridLayout, QPushButton,QLabel.  
from PyQt5.QtGui import QPixmap
from PyQt5 import QtGui
from gwWindow import groundwaterWindow
from swWindow import surfacewaterWindow
from kwWindow import karstwaterWindow
from PyQt5.QtCore import Qt, QModelIndex
from PyQt5.QtSql import QSqlDatabase, QSqlTableModel, QSqlQuery
from PyQt5.QtWidgets import (QApplication, QMainWindow, QMessageBox, QTableView,     QPushButton, QGridLayout, QGroupBox, QVBoxLayout)
from PyQt5 import QtCore
from PyQt5.QtCore import pyqtSignal


class MainWindow(QtWidgets.QWidget):
    def __init__(self):
        QtWidgets.QWidget.__init__(self)
        self.title = "PPCP Selection"
        self.top = 100

        self.left = 100
        self.width = 1200
        self.height = 1200


        self.InitWindow()

    def InitWindow(self):
        self.setWindowTitle(self.title)
        self.setGeometry(self.top, self.left, self.width, self.height)

        self.createLayout()

        vBoxLayout = QVBoxLayout()

        vBoxLayout.addWidget(self.groupBox1)
        # vBoxLayout.addWidget(self.groupBox2)
        self.setLayout(vBoxLayout)
        # self.showMaximized()

    def createLayout(self):
        self.groupBox1 = QGroupBox("PPCP Selection")
        self.groupBox1.setFont(QtGui.QFont("Arial", 30))
        gridLayout = QGridLayout()
        gridLayout.setRowStretch(2, 2)


        self.button1 = QPushButton("Evaluate")
        gridLayout.addWidget(self.button1, 1, 0, 1, 1)
        #self.button1.clicked.connect(self.switch1)
        gridLayout.addWidget(self.button1)
        self.button1.setFocusPolicy(QtCore.Qt.NoFocus)

        self.groupBox1.setLayout(gridLayout)


class RealMainWindow(QMainWindow):
    def __init__(self, parent=None):
        super().__init__(parent)
        self.setWindowTitle("QTableView Example")
        self.resize(415, 200)
        # Set up the model
        self.model = TableModel(self)
        self.model.setTable("Table2")
        self.model.setEditStrategy(QSqlTableModel.OnFieldChange)
        #self.model.setHeaderData(0, Qt.Horizontal, "ID")


        self.model.select()
        # Set up the view
        self.view = QTableView()
        self.view.setModel(self.model)
        #self.view.resizeColumnsToContents()

        self.another = MainWindow()

        # I want both of the following


        # self.setCentralWidget(self.view)
        # self.setCentralWidget(self.another)

    def secondWindow(self):
        self.another = MainWindow()
        self.another.show()



class TableModel(QSqlTableModel):
    def __init__(self, *args, **kwargs):
        QSqlTableModel.__init__(self, *args, **kwargs)
        self.checkeable_data = {}

    def flags(self, index):
        fl = QSqlTableModel.flags(self, index)
        if index.column() == 0:
            fl |= Qt.ItemIsUserCheckable
        return fl

    def data(self, index, role=Qt.DisplayRole):
        if role == Qt.CheckStateRole and (
            self.flags(index) & Qt.ItemIsUserCheckable != Qt.NoItemFlags
        ):
            if index.row() not in self.checkeable_data.keys():
                self.setData(index, Qt.Unchecked, Qt.CheckStateRole)
            return self.checkeable_data[index.row()]
        else:
            return QSqlTableModel.data(self, index, role)

    def setData(self, index, value, role=Qt.EditRole):
        if role == Qt.CheckStateRole and (
            self.flags(index) & Qt.ItemIsUserCheckable != Qt.NoItemFlags
         ):
            self.checkeable_data[index.row()] = value
            self.dataChanged.emit(index, index, (role,))
            return True
        return QSqlTableModel.setData(self, index, value, role)


def createConnection():

    con = QSqlDatabase.addDatabase("QSQLITE")
    con.setDatabaseName("ppcp_database.db")
    if not con.open():
        QMessageBox.critical(
            None,
            "QTableView Example - Error!",
            "Database Error: %s" % con.lastError().databaseText(),
        )
        return False
    return True

app = QApplication(sys.argv)
if not createConnection():
  sys.exit(1)
win = RealMainWindow()
win.show()
sys.exit(app.exec_())
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-03-15 18:45:14

使用Qt布局:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class RealMainWindow(QMainWindow):
    def __init__(self, parent=None):
        super().__init__(parent)
        self.setWindowTitle("QTableView Example")
        self.resize(415, 200)

        # Set up the model
        self.model = TableModel(self)
        self.model.setTable("Table2")
        self.model.setEditStrategy(QSqlTableModel.OnFieldChange)
        self.model.select()

        self.view = QTableView()
        self.view.setModel(self.model)

        self.another = MainWindow()

        central_widget = QWidget()
        self.setCentralWidget(central_widget)
        lay = QVBoxLayout(central_widget)
        lay.addWidget(self.view)
        lay.addWidget(self.another)
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66643206

复制
相关文章

相似问题

领券
社区富文本编辑器全新改版!诚邀体验~
全新交互,全新视觉,新增快捷键、悬浮工具栏、高亮块等功能并同时优化现有功能,全面提升创作效率和体验
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文