QT QMainWindow窗口中添加 QWidget容器类 应该怎么添加?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了QT QMainWindow窗口中添加 QWidget容器类 应该怎么添加?相关的知识,希望对你有一定的参考价值。

可能我的问题有点怪,我想在窗口中添加一个QWidget容器类。然后对它进行布局排版,以便做其他工作。类似下图我希望能通过代码实现,于是在敲代码的时候QWidget *wgt = new QWidget;wgt->addwidget //这个时候出现问题了,似乎没有办法addwidget请问各位大神。这时候要怎么做,或者是可能事先要先做一个什么样的处理。ps.因为是赶鸭子上架,临时拿起QT学习书进行学习,从来没接触过C++和QT,所以可以说是白痴级别。希望各位大神在解释的时候能够直白一点点。

参考技术A 用Creator拖入一个widget就不需要在代码里再new了,那个widget就已经在mainwindow里了,运行一下就可以在mainwindow里看到那个widget
QWidget *wgt = new QWidget; // 这个是新建一个widget追问

你好。是这样的,我也知道直接在ui里面可以直接作,但是我想要把这个widget变成listwidget的item。用到ui->listWidget->setItemWidget(*item,*widget)这个应该没错吧。

在setitemWidget里面的参数里,这个*widget应该就要用到自己做的这个widget对吧。

请问要如何定义?如果可以能否加个qq

追答

setItemWidget()的第二个参数确实是要自己新声明一个widget,试试这样

    QWidget *widget = new QWidget();                //new widget
    widget->setStyleSheet("background-color:red;"); //加背景色,看的清楚
    QListWidgetItem *item = new QListWidgetItem();  //新的item
    ui->listWidget->addItem(item);                  //将item加入listWidget
    ui->listWidget->setItemWidget(item,widget);     //widget放到item中

不知道你要做什么功能,这样应该可以的,Qwidget也可以换成其他控件,完成不同的功能

追问

是的,按照你的方法确实成功了,不过最后我在ui界面设计了一个widget布局,参数直接使用ui->mywidget 也成功实现了。

按照你的内容我加了一个for循环,出现了10个item。但是貌似因为最后赋值setitemwidget的问题,这个widget最后只出现在了第十个item上,前9个item皆为空。。。

如图。。。

请问这种情况想要实现每条都有一样的模板应该如何做

追答

你的ui->mywidget只是1个widget,而10个item就需要10个widget,总不能在ui界面上拖入10个Qwidget吧?而且我看你这个item的个数估计也不是固定的,每个item上还需要其他控件。这样的话Qwidget实际上就不能满足要求了,你需要重新声明一个继承Qwidget类的widget类,把需要的控件放到新的widget里去,然后每次用到的时候都去new这个新的widget。

追问

对的。我需要后期调用库获取消息之后传导两个label中,但是如果用ui方法做的话似乎没有太好的办法能够传递参数,同时你也说的没错,我需要更多的item来承载这些内容。

1:如果按照你说的方法,把new widget并且把setitemwidget作为一个函数,将参数设为变量,是否可以实现我的构想?

2:如果new widget容器的话,是不是应该也用new来添加部件,对部件和widget布局设置。

追答

这样跟你说吧,在你的Qt工程【头文件】右击,选择【添加新文件..】,然后选择【Qt】【Qt设计师界面类】,然后选择【widget】,然后给新的类起个名字(假如叫MyWidget),这样,你的qt工程里会出来一个基于Qwidget的MyWidget类,在MyWidget类的ui文件上添加【设备名】【配对】【详细】按钮,然后布局什么的你自己弄

MyWidget *w = new MyWidget(); //和上面的代码一样

本回答被提问者和网友采纳
参考技术B Qwidget* wgt=new Qwidget(this);
wgt->setGeometry(0,0,50,50);

Qt:为啥在 QMainWindow 中添加状态栏会影响大小调整?

【中文标题】Qt:为啥在 QMainWindow 中添加状态栏会影响大小调整?【英文标题】:Qt: Why does adding a status bar to QMainWindow messes up size adjustment?Qt:为什么在 QMainWindow 中添加状态栏会影响大小调整? 【发布时间】:2021-04-18 08:47:16 【问题描述】:

在一个示例 Qt 应用程序中,我创建了一个 QMainWindow,并以 QTableView 作为其中心小部件(参见问题末尾的代码)。

重要的是,计算主窗口的大小以适合表格:

但是,如果我添加状态栏,则不再计算大小以完全适合表格。有一点table被隐藏了,提示table view添加滚动条:

这似乎不应该发生。仅仅添加一个状态栏不应阻止主窗口相应地适应其内容。

如何避免这种情况而不必手动计算必要的大小(这当然不容易维护,因为每次窗口中的设计和小部件更改时都必须重新计算)?

代码如下。它在 PyQt 中,但不是特定于 Python 的,我相信同样的问题应该出现在 C++ 中。

import sys

from PyQt5 import QtCore, QtWidgets
from PyQt5.QtCore import Qt
from PyQt5.QtWidgets import QApplication, QMainWindow, QTableView, QStatusBar

use_status_bar = False  # includes a status bar; but also messes up the size adjustment


class TableModel(QtCore.QAbstractTableModel):
    def __init__(self):
        super().__init__()

    def data(self, index, role=None):
        if role == Qt.DisplayRole:
            return 42

    def rowCount(self, index):
        return 10

    def columnCount(self, index):
        return 4


class MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()

        self.setWindowTitle("A simple table app")

        self.tableView = QTableView()

        self.model = TableModel()
        self.tableView.setModel(self.model)
        self.tableView.setSizeAdjustPolicy(QtWidgets.QAbstractScrollArea.AdjustToContents)

        if use_status_bar:
            self.setStatusBar(QStatusBar(self))

        self.setCentralWidget(self.tableView)


app = QApplication(sys.argv)
w = MainWindow()
w.show()
app.exec_()

【问题讨论】:

【参考方案1】:

PyQt5-5.15.1 中,如果您添加,它会按预期工作

self.tableView.setVerticalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff)
self.tableView.setHorizontalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff)

(否则表格左侧和底部会有两个空白区域)。

您使用哪个版本或PyQt5

【讨论】:

我用的是同一个版本。是的,它可以在没有滚动条的情况下工作,但我们不应该仅仅因为我们添加了一个状态栏就必须关闭滚动条来调整窗口大小。 这很奇怪,我无法复制第二张图片,一切正常 感谢您的检查。但是,如果一切正常,您为什么在回答中说它按预期工作 if 一个删除滚动条?而且,顺便说一句,您使用的是哪个操作系统?我在 Windows 10 上。 如果我不删除滚动条,我会在表格旁边看到空白区域,而不是像 image2 上的滚动条。我也是win10。 i.imgur.com/9BcvYif.png

以上是关于QT QMainWindow窗口中添加 QWidget容器类 应该怎么添加?的主要内容,如果未能解决你的问题,请参考以下文章

QT QMainWindow窗口中添加 QWidget容器类 应该怎么添加?

Qt:为啥在 QMainWindow 中添加状态栏会影响大小调整?

QT:在其他窗口中显示QMainWindow

Qt入门系列开发教程基础控件篇QMainWindow主窗口

Qt 中 QMainWindow 上的另一个窗口

Qt中的主窗口之菜单栏