我有一个QMainWindow,在左侧包含一个QTreeWidget,在右侧包含另一个QMainWindow,并将windowFlags设置为Qt :: Widget。
这是因为QMainWindow是向QWidget提供停靠功能的唯一方法。 (如果需要,我希望将停靠的组件完全从“真实”窗口中弹出。
我的问题是,即使用户未在左侧选择项目,我也希望用户能够保留弹出的窗口小部件。
例如,这是全局布局:
假设我选择了项目1。在右侧,我将有一些可停靠的小部件,可以根据需要重新排序。如果我弹出来留意它,那么我不希望它在选择项目2时消失。
更进一步,我可能想一次显示所有项目的可停靠小部件。
我实现这一目标的最初想法是使每个Item都在其数据中存储其专用的QMainWindow,而我只是切换正确的那个以反映当前活动的那个。
也许我想要的是一个坏主意,也许甚至都不可行。
有Qt知识的人可以告诉我是否在做/想要做错什么吗?
编辑:
如果有一种方法可以手动触发“内部QMainWindow”弹出窗口,那对我来说将是非常好的。例如,右上角的“弹出”按钮将完全弹出该窗口并使它成为一个全新的窗口(不过仍然与另一个窗口链接)
编辑2:
我想指出的是,我还没有尝试过任何有关此问题的内容。我本质上是想知道它是否适合Qt的做事方式。
This问题使我很高兴能够仅对程序的一部分提供对接功能,但我仍不确定自己想要什么。我真的可以实现吗?
MVCE Edit7:
希望我不会忘记任何事情,因为这是通过修改文件来完成的。
mainwindow2.cpp
#include "mainwindow2.hh"
#include "ui_mainwindow2.h"
#include <QTreeWidgetItem>
MainWindow2::MainWindow2(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow2)
{
ui->setupUi(this);
ui->mainPanel->setWindowFlags(Qt::Widget);
QTreeWidgetItem* item = new QTreeWidgetItem;
item->setData(0, 0, QVariant::fromValue(QString("Item 1")));
ui->accountsTreeWidget->addTopLevelItem(item);
QTreeWidgetItem* item2 = new QTreeWidgetItem;
item2->setData(0, 0, QVariant::fromValue(QString("Item 2")));
ui->accountsTreeWidget->addTopLevelItem(item2);
}
MainWindow2::~MainWindow2()
{
delete ui;
}
主窗口2.hh
#ifndef MAINWINDOW2_HH
#define MAINWINDOW2_HH
#include <QMainWindow>
namespace Ui {
class MainWindow2;
}
class MainWindow2 : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow2(QWidget *parent = 0);
~MainWindow2();
private:
Ui::MainWindow2 *ui;
};
#endif // MAINWINDOW2_HH
mainwindow2.ui
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>MainWindow2</class>
<widget class="QMainWindow" name="MainWindow2">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>1200</width>
<height>700</height>
</rect>
</property>
<property name="minimumSize">
<size>
<width>1200</width>
<height>700</height>
</size>
</property>
<property name="windowTitle">
<string>Main Window</string>
</property>
<widget class="QWidget" name="centralWidget">
<property name="minimumSize">
<size>
<width>1200</width>
<height>658</height>
</size>
</property>
<layout class="QGridLayout" name="gridLayout">
<item row="0" column="1" rowspan="2" colspan="2">
<widget class="QMainWindow" name="mainPanel"/>
</item>
<item row="0" column="0">
<widget class="QTreeWidget" name="accountsTreeWidget">
<property name="minimumSize">
<size>
<width>200</width>
<height>0</height>
</size>
</property>
<property name="maximumSize">
<size>
<width>300</width>
<height>16777215</height>
</size>
</property>
<property name="frameShape">
<enum>QFrame::NoFrame</enum>
</property>
<property name="selectionBehavior">
<enum>QAbstractItemView::SelectItems</enum>
</property>
<property name="uniformRowHeights">
<bool>true</bool>
</property>
<attribute name="headerVisible">
<bool>false</bool>
</attribute>
<column>
<property name="text">
<string notr="true">1</string>
</property>
</column>
</widget>
</item>
</layout>
</widget>
</widget>
<layoutdefault spacing="6" margin="11"/>
<connections/>
</ui>
main.cpp
#include "mainwindow2.hh"
#include <QApplication>
#include <QStyleFactory>
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
app.setStyle(QStyleFactory::create("Fusion"));
MainWindow2 w;
w.show();
return app.exec();
}
project.pro
#-------------------------------------------------
#
# Project created by QtCreator 2017-11-12T23:07:49
#
#-------------------------------------------------
QT += core gui
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
TARGET = project
TEMPLATE = app
DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0
INCLUDEPATH += $$PWD
SOURCES += \
main.cpp \
mainwindow2.cpp
HEADERS += \
mainwindow2.hh
FORMS += \
mainwindow2.ui
最佳答案
在右侧,您可以添加带有QBoxLayout的父窗口小部件,将所有项目附加到该窗口小部件,然后根据需要隐藏,显示和排序它们。
使它们成为一个自定义类,并带有一个公共int变量,以便以后您可以识别它们。将它们的指针存储在QList中,然后循环播放列表并根据您的条件隐藏或显示项目(使用int变量)。
例:
物料类别A->整型值0
类别B->整数值1的项目
等等...