首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >在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
运行
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
运行
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

复制
相关文章
QMainWindow 添加中心部件
上几篇文章我们使用 QMainWindow 添加了菜单栏、工具栏、状态栏等控件,他们分别在窗口中起到不同的作用。但千万别忽略了中间位置,因为中间位置是我们用来添加其他控件的位置,如果你直接在对象中new了某些其他控件(比如一个button),那么这个控件会覆盖菜单栏导致不能正常显示。这就需要我们来创建一个中心部件,以保证各个控件之间不会冲突。
我与梦想有个约会
2023/10/20
2380
QMainWindow 添加中心部件
QMainWindow 和 QWidget 设置layout
给QWidget或者QDialog设置布局的时候方式很简单。创建好一个布局:mainLayout,然后不停地把各个控件往mainLayout里面放,最后调用setLayout(mainLayout)就行了。 QMainWindow中使用这个方法的时候却不管用,因为QMainWindow是默认有layout的,所以再次设置layout会失效。 会出现这种提示: QWidget::setLayout: Attempting to set QLayout "" on
_gongluck
2018/03/09
3.9K0
PyQt5-基本控件| 主窗口的类型、创建以及代码如何实现?
虫无涯
2023/10/24
4390
PyQt QMainWindow 简单使用
QMainWindow继承自QWidget QMainWindow相当于程序的主界面,内置了menu和toolBar。 使用 Qt Designer 可以很方便地添加menu选项。
AnRFDev
2021/02/01
1.2K0
Pyqt 主窗口(QMainWindow)简介
下面我写了一个简单的例子,只实现了极少数的功能,仅供参考。后续会详细介绍主窗口(QMainWindow)程序各个部分的写法。推荐在浏览器中打开并横屏查看代码。
用户6021899
2019/08/14
1.9K0
Qt Designer基本控件介绍——Containers(容器)
Group Box : 组合框。就是将组合框内的控件标识为一组控件来使用,即一次只能选择其中的一个控件:如性别选择,当选择男时,女不被选择;当选择女时男不被选择 clicked(): 点击QGroupBox控件时,发射该信号; toggled(): 当QGroupBox的状态发生了改变时,发射该信息 import sys from PyQt5.QtCore import Qt from PyQt5.QtGui import QPixmap from PyQt5.QtWidgets import QAppli
Elsa_阿尼
2021/07/12
6K0
Qt Designer基本控件介绍——Containers(容器)
【说站】python PyQt创建上下文菜单
2、将contextMenuPolicy设置为Qt.ActionsContextMenu,以便在上下文菜单中显示操作小部件。
很酷的站长
2022/11/24
3840
【说站】python PyQt添加菜单选项
1、QWidget提供.addActions().该方法采用一系列操作,并将其附加到当前的小部件对象中。
很酷的站长
2022/11/24
5540
【QT】QT窗口部件
QT提供的默认部件基类包括QMainWindow、QWidget、和QDialog,这三个部件基类也是用的最多的。
半生瓜的blog
2023/05/13
1.3K0
【QT】QT窗口部件
Qt Designer基本控件介绍——Display Widgets(显示小部件)
Label : 标签 QLabel的作用: 占位符 显示文本 显示图片 放置gif动画 超链接 提示标记 常用方法: text():获得Qlabel的文本内容 setText():设置Qlabel的文本内容 selectedText():返回所选择的字符 信号: linkActiveted:当单击标签中的超链接,希望在新窗口打开这个超链接时,setOpenExternalLinks特性必须设置为True,即setOpenExternalLinks(True) linkHovered:当鼠标指针滑过标签中
Elsa_阿尼
2021/07/12
8.6K0
Qt Designer基本控件介绍——Display Widgets(显示小部件)
Python Qt GUI设计:QTabWidget、QStackedWidget和QDockWidget容器控件类(提升篇—2)
有时候我们可能会面临这样一种情况:所开发的程序包含了太多的控件,导致一个窗口装载不下或者装载的控件太多而不美观。
不脱发的程序猿
2021/11/08
2.6K0
Python Qt GUI设计:QTabWidget、QStackedWidget和QDockWidget容器控件类(提升篇—2)
基于PySide6的GUI程序开发全流程(看完就会)
GUI程序的开发方式太多了,这里肯定就是Python语言了,至于为什么,就不多描述了;
MinChess
2023/09/29
13.6K0
基于PySide6的GUI程序开发全流程(看完就会)
如何实时可视化渲染你的数据?
在之前介绍PyQtGraph的文章中,我们都是一次性的获取数据并将其绘制为图形。然而在很多场景中,我们都需要对实时的数据进行图形化展示。
龙哥
2019/05/16
2.5K0
如何实时可视化渲染你的数据?
PyQt5 高级界面控制(表格、树、tab、dock、scrollbar、多文档界面)
learn from 《PyQt5 快速开发与实战》 https://doc.qt.io/qtforpython/index.html https://www.riverbankcomputing.com/static/Docs/PyQt5
Michael阿明
2022/05/30
7K0
PyQt5 高级界面控制(表格、树、tab、dock、scrollbar、多文档界面)
Python Qt GUI设计:QTabWidget、QStackedWidget和QDockWidget容器控件类(提升篇—2)「建议收藏」
有时候我们可能会面临这样一种情况:所开发的程序包含了太多的控件,导致一个窗口装载不下或者装载的控件太多而不美观。
全栈程序员站长
2022/11/09
2.7K0
Python Qt GUI设计:QTabWidget、QStackedWidget和QDockWidget容器控件类(提升篇—2)「建议收藏」
PyQt5案例汇总(简洁版)
### 01菜单栏 ```python import sys from PyQt5.QtWidgets import QMainWindow, QAction, qApp, QApplication from PyQt5.QtGui import QIcon class Example(QMainWindow): def __init__(self): super().__init__() self.initUI() def initUI(self):
victorfengming
2021/11/26
2K0
Qt For Python按钮控件使用实例
在之前的文章中,我们介绍了PyQt教程,不容错过5和PySide2中主窗口控件MainWindow的使用、窗口控件的4中基础布局管理。从本篇开始,我们来了解一下PyQt5和PySide2中基础控件的使用,其中包括:
州的先生
2019/08/23
4.2K0
Qt For Python按钮控件使用实例
PyQt 键盘事件和鼠标事件
PyQt为事件处理提供了两种机制:高级的信号和槽机制,以及低级的事件处理程序。前者已经介绍过,后者也有涉及,比如我们曾重新实现过窗口部件的closeEvent()。
用户6021899
2019/08/14
6.5K0
PyQt 创建自定义QWidget
QApplication是一个单例,在QWidget中可以通过QApplication.instance()获取到对象
AnRFDev
2021/02/01
1.8K0
点击加载更多

相似问题

在QMainWindow中从QWidget (PyQt4)调用方法/属性

10

在pyqt QWidget中添加子菜单

13

PyQt4: QWidget和QMainWindow之间的区别

245

具有不同视图的PyQt4 QMainWindow as QWidget

17

QWidget不能在QMainWindow实例PyQt5上显示

13
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文