fix minsize 10

This commit is contained in:
brige 2025-11-17 00:07:24 +08:00
parent dfa0d513e6
commit ef7ed1c300
9 changed files with 51 additions and 58 deletions

View File

@ -59,15 +59,10 @@ int main(int argc, char* argv[]) {
MainFrame mainWindow; MainFrame mainWindow;
splash.showMessage(("正在创建主窗口..."), Qt::AlignHCenter | Qt::AlignBottom, Qt:: white); splash.showMessage(("正在创建主窗口..."), Qt::AlignHCenter | Qt::AlignBottom, Qt:: white);
// 先显示窗口,再在事件循环启动后最大化,避免首次显示时原生窗口放置未就绪导致尺寸异常 mainWindow.show();
mainWindow.showMaximized(); QTimer::singleShot(20, &mainWindow, &MainFrame::showMaximized);
// QTimer::singleShot(0, &mainWindow, &MainFrame::showMaximized);
splash.finish(&mainWindow); splash.finish(&mainWindow);
int ret = app.exec(); int ret = app.exec();
// app.Uninit();
Sleep(200);
return ret; return ret;
} }

View File

@ -172,6 +172,16 @@ bool FramelessDelegateWin::nativeEvent(const QByteArray & eventType, void* messa
mmi->ptMaxTrackSize.x = (rcMon.right - rcMon.left) + frameX * 2; mmi->ptMaxTrackSize.x = (rcMon.right - rcMon.left) + frameX * 2;
mmi->ptMaxTrackSize.y = (rcMon.bottom - rcMon.top) + frameY * 2; mmi->ptMaxTrackSize.y = (rcMon.bottom - rcMon.top) + frameY * 2;
const QSize minSize = mainWidget_->minimumSize();
const double dpr = mainWidget_->devicePixelRatioF();
const int minWpx = static_cast<int>(std::round(minSize.width() * dpr));
const int minHpx = static_cast<int>(std::round(minSize.height() * dpr));
// Guard against zero/negative values
const int clampedMinW = std::max(1, minWpx) + frameX * 2;
const int clampedMinH = std::max(1, minHpx) + frameY * 2;
mmi->ptMinTrackSize.x = clampedMinW;
mmi->ptMinTrackSize.y = clampedMinH;
} }
if (::IsZoomed(msg->hwnd)) { if (::IsZoomed(msg->hwnd)) {

View File

@ -11,10 +11,10 @@ FramelessWindow::FramelessWindow(QWidget* parent)
| Qt::FramelessWindowHint | Qt::FramelessWindowHint
| Qt::WindowSystemMenuHint | Qt::WindowSystemMenuHint
| Qt::WindowMaximizeButtonHint | Qt::WindowMaximizeButtonHint
| Qt::WindowMinimizeButtonHint); | Qt::WindowMinimizeButtonHint
);
delegate_ = FramelessDelegate::Create(this); delegate_ = FramelessDelegate::Create(this);
} }
FramelessWindow::~FramelessWindow() { FramelessWindow::~FramelessWindow() {
@ -23,7 +23,6 @@ FramelessWindow::~FramelessWindow() {
void FramelessWindow::SetTitleBar(FrameTitleBar* titleBar) { void FramelessWindow::SetTitleBar(FrameTitleBar* titleBar) {
titleBar->SetMainWidget(this); titleBar->SetMainWidget(this);
if (delegate_) { if (delegate_) {
// 通知委托当前标题栏,以便把它作为可拖动区域处理。
delegate_->SetTitleBar(titleBar); delegate_->SetTitleBar(titleBar);
} }
} }
@ -33,7 +32,6 @@ bool FramelessWindow::nativeEvent(const QByteArray& eventType, void* message, qi
#else #else
bool FramelessWindow::nativeEvent(const QByteArray & eventType, void* message, long* result) { bool FramelessWindow::nativeEvent(const QByteArray & eventType, void* message, long* result) {
#endif #endif
// 先让无边框委托处理原生事件(如 WM_NCHITTEST 以支持边缘拖动缩放)。
if (delegate_ && delegate_->nativeEvent(eventType, message, result)) { if (delegate_ && delegate_->nativeEvent(eventType, message, result)) {
return true; return true;
} }

View File

@ -37,6 +37,8 @@ MainFrame::MainFrame(QWidget *parent) :
{ {
ui->setupUi(this); ui->setupUi(this);
setMinimumSize(800, 600);
assert(nullptr == s_instance); assert(nullptr == s_instance);
s_instance = this; s_instance = this;
@ -102,13 +104,6 @@ void MainFrame::InitUI() {
FileManagerMenu* fileMenu = new FileManagerMenu(this); FileManagerMenu* fileMenu = new FileManagerMenu(this);
AddMenuWidget("file_manager", tr("file manager"), fileMenu); AddMenuWidget("file_manager", tr("file manager"), fileMenu);
//AddMenuWidget("view_manager", tr("view manager"), new ViewManagerMenu(this));
//AddMenuWidget("plan_manager", tr("plan manager"), new PlanManagerMenu(this));
//AddMenuWidget("dynamic_display", tr("dynamic display"), new DynamicDisplayMenu(this));
// ChartPlotMenu* chartMenu = new ChartPlotMenu(this);
// AddMenuWidget("simu_manager", tr("simu manager"), chartMenu);
// Command buttons menu based on parsed commands
SimuRunMenu* simuRunMenu = new SimuRunMenu(this); SimuRunMenu* simuRunMenu = new SimuRunMenu(this);
AddMenuWidget("simu_manager", tr("simu manager"), simuRunMenu); AddMenuWidget("simu_manager", tr("simu manager"), simuRunMenu);
@ -123,11 +118,6 @@ void MainFrame::InitUI() {
simuRunMenu->SetMainWindow(mainWindow); simuRunMenu->SetMainWindow(mainWindow);
/*OsgWidget* viewWidget = mainWindow->GetViewWidget();
connect(fileMenu, &FileManagerMenu::LoadDyt, viewWidget, &OsgWidget::OnLoadDyt);*/
//connect(system_, &SystemManagerMenu::signalShowUISetting, mainWindow, &MainWindow::slotShowUISetting);
if (ui->menuWidget->count() > 0) { if (ui->menuWidget->count() > 0) {
ui->menuWidget->setCurrentIndex(0); ui->menuWidget->setCurrentIndex(0);
menuWidget_.isEmpty() ? assert(false) : menuWidget_.key(0)->setChecked(true); menuWidget_.isEmpty() ? assert(false) : menuWidget_.key(0)->setChecked(true);

View File

@ -38,6 +38,7 @@ MainWindow::MainWindow(QWidget* parent)
: QMainWindow(parent) : QMainWindow(parent)
, ui(new Ui::MainWindow) { , ui(new Ui::MainWindow) {
ui->setupUi(this); ui->setupUi(this);
setMinimumSize(800, 600);
LOG_INFO("MainWindow::MainWindow - Constructor called, about to call InitUI"); LOG_INFO("MainWindow::MainWindow - Constructor called, about to call InitUI");
InitUI(); InitUI();
@ -70,7 +71,6 @@ void MainWindow::InitUI() {
mapDockWidget_.insert("ModelBrowser", model); mapDockWidget_.insert("ModelBrowser", model);
addDockWidget(Qt::LeftDockWidgetArea, model); addDockWidget(Qt::LeftDockWidgetArea, model);
// 创建预制模型面板
DockWidget* presetModel = new DockWidget(tr("preset models"), 0); DockWidget* presetModel = new DockWidget(tr("preset models"), 0);
presetModel->SetDockWidgetTitleBar(new DockTitleBar(presetModel)); presetModel->SetDockWidgetTitleBar(new DockTitleBar(presetModel));
presetModel->setObjectName("Dock.PresetModelPanel"); presetModel->setObjectName("Dock.PresetModelPanel");
@ -82,11 +82,8 @@ void MainWindow::InitUI() {
DockWidget* attribte = new DockWidget(tr("attribte"), 0); DockWidget* attribte = new DockWidget(tr("attribte"), 0);
attribte->SetDockWidgetTitleBar(new DockTitleBar(attribte)); attribte->SetDockWidgetTitleBar(new DockTitleBar(attribte));
attribte->setObjectName("Dock.PropertyBrowser"); attribte->setObjectName("Dock.PropertyBrowser");
//addDockWidget(pSettingUI->GetArea("PropertyBrowser"), attribte);
propertyBrowser_ = new PropertyBrowser(0); propertyBrowser_ = new PropertyBrowser(0);
propertyBrowser_->AttachDock(attribte); propertyBrowser_->AttachDock(attribte);
// Ensure property panel has a reasonable minimum width; no maximum limit
attribte->setMinimumWidth(240);
mapDockWidget_.insert("PropertyBrowser", attribte); mapDockWidget_.insert("PropertyBrowser", attribte);
addDockWidget(Qt::RightDockWidgetArea, attribte); addDockWidget(Qt::RightDockWidgetArea, attribte);
@ -106,23 +103,18 @@ void MainWindow::InitUI() {
connect(modelBrowser_, &ModelBrowser::FileEntryChange, propertyBrowser_, &PropertyBrowser::OnFileEntryChange); connect(modelBrowser_, &ModelBrowser::FileEntryChange, propertyBrowser_, &PropertyBrowser::OnFileEntryChange);
connect(modelBrowser_, &ModelBrowser::GroupChange, propertyBrowser_, &PropertyBrowser::OnGroupChange); connect(modelBrowser_, &ModelBrowser::GroupChange, propertyBrowser_, &PropertyBrowser::OnGroupChange);
qtOsgViewWidget_ = new OsgWidget; qtOsgViewWidget_ = new OsgWidget(0);
qtOsgViewWidget_->Initialize(); qtOsgViewWidget_->Initialize();
DockWidget* viewDock = new DockWidget(tr("Main View"), 0); DockWidget* mainView = new DockWidget(tr("Main View"), 0);
viewDock->SetDockWidgetTitleBar(new DockTitleBar(viewDock)); mainView->SetDockWidgetTitleBar(new DockTitleBar(mainView));
viewDock->setObjectName("Dock.MainView"); mainView->setObjectName("Dock.MainView");
viewDock->setWidget(qtOsgViewWidget_); qtOsgViewWidget_->AttachDock(mainView);
// Ensure main view has a reasonable minimum size to avoid being squeezed mapDockWidget_.insert("MainView", mainView);
// Use smaller minimum size to support smaller displays addDockWidget(Qt::RightDockWidgetArea, mainView);
qtOsgViewWidget_->setMinimumSize(640, 480);
viewDock->setMinimumSize(640, 480);
addDockWidget(Qt::LeftDockWidgetArea, viewDock);
mapDockWidget_.insert("MainView", viewDock);
splitDockWidget(model, viewDock, Qt::Horizontal); splitDockWidget(model, mainView, Qt::Horizontal);
// 将预制模型面板与模型浏览器标签化
tabifyDockWidget(model, presetModel); tabifyDockWidget(model, presetModel);
dataPanelManager_ = new DataPanelManager(this, this); dataPanelManager_ = new DataPanelManager(this, this);

View File

@ -48,6 +48,7 @@ private:
class PropertyBrowser* propertyBrowser_{ nullptr }; class PropertyBrowser* propertyBrowser_{ nullptr };
class QWebEngineView* webEngineView_{ nullptr }; class QWebEngineView* webEngineView_{ nullptr };
class OsgWidget* qtOsgViewWidget_{ nullptr }; class OsgWidget* qtOsgViewWidget_{ nullptr };
//QWidget* qtOsgViewWidget_{ nullptr };
class SignalIndicatorLampUI* signalIndicatorLampUI_{ nullptr }; class SignalIndicatorLampUI* signalIndicatorLampUI_{ nullptr };
class CodeEdtUI* matlabFileDlg_{ nullptr }; class CodeEdtUI* matlabFileDlg_{ nullptr };

View File

@ -3,8 +3,8 @@
#include <QBoxLayout> #include <QBoxLayout>
#include <QDebug> #include <QDebug>
#include "DockTitleBar.h" #include "ui/DockTitleBar.h"
#include "DockWidget.h" #include "ui/DockWidget.h"
#include "ModelBrowser/ModelTreeWidget.h" #include "ModelBrowser/ModelTreeWidget.h"
#include "workspace/WorkSpaceManager.h" #include "workspace/WorkSpaceManager.h"

View File

@ -21,7 +21,6 @@
#include "OsgViewer.h" #include "OsgViewer.h"
#include "common/SpdLogger.h" #include "common/SpdLogger.h"
#include "scene/OEScene.h" #include "scene/OEScene.h"
#include "ui/MainFrame.h"
#include "workspace/WorkSpaceManager.h" #include "workspace/WorkSpaceManager.h"
#include "workspace/WorkSpace.h" #include "workspace/WorkSpace.h"
#include "scutcheon/osgScutcheon.h" #include "scutcheon/osgScutcheon.h"
@ -33,6 +32,10 @@
#include "entities/Entity.h" #include "entities/Entity.h"
#include "entities/Component.h" #include "entities/Component.h"
#include "ui/DockTitleBar.h"
#include "ui/DockWidget.h"
#include "ui/MainFrame.h"
static void ConfigureView( osgViewer::View* view ) { static void ConfigureView( osgViewer::View* view ) {
view->addEventHandler(new osgViewer::StatsHandler()); view->addEventHandler(new osgViewer::StatsHandler());
view->addEventHandler(new osgViewer::WindowSizeHandler()); view->addEventHandler(new osgViewer::WindowSizeHandler());
@ -56,13 +59,12 @@ OsgWidget::OsgWidget(QWidget* parent, Qt::WindowFlags f)
setMouseTracking(true); setMouseTracking(true);
setKeyEventSetsDone(0); setKeyEventSetsDone(0);
// 启用拖拽接收
setAcceptDrops(true); setAcceptDrops(true);
connect( &timer_, SIGNAL(timeout()), this, SLOT(update()) ); connect( &timer_, SIGNAL(timeout()), this, SLOT(update()) );
timer_.start( 10 ); timer_.start( 10 );
setMinimumSize(100, 100); //setMinimumSize(800, 100);
LOG_INFO("OsgWidget::OsgWidget"); LOG_INFO("OsgWidget::OsgWidget");
} }
@ -131,6 +133,19 @@ void OsgWidget::LoadDefaultScene() {
} }
} }
void OsgWidget::AttachDock(DockWidget* dockWidget) {
if (nullptr == dockWidget) {
qDebug() << __FUNCTION__ << "dockwidget is nullptr";
return;
}
dockWidget->SetDockWidgetTitleBar(nullptr);
dockWidget->setWidget(this);
DockTitleBar* dockTitleBar = new DockTitleBar;
dockWidget->SetDockWidgetTitleBar(dockTitleBar);
}
osgQt::GraphicsWindowQt* OsgWidget::createGraphicsWindow(int x, int y, int w, int h, const std::string& name, osgQt::GraphicsWindowQt* OsgWidget::createGraphicsWindow(int x, int y, int w, int h, const std::string& name,
bool windowDecoration) { bool windowDecoration) {
osg::DisplaySettings* ds = osg::DisplaySettings::instance().get(); osg::DisplaySettings* ds = osg::DisplaySettings::instance().get();
@ -199,7 +214,6 @@ void OsgWidget::dragEnterEvent(QDragEnterEvent* event) {
} }
void OsgWidget::dragMoveEvent(QDragMoveEvent* event) { void OsgWidget::dragMoveEvent(QDragMoveEvent* event) {
// 检查是否是预制模型拖拽
if (event->mimeData()->hasFormat("application/x-preset-model")) { if (event->mimeData()->hasFormat("application/x-preset-model")) {
event->acceptProposedAction(); event->acceptProposedAction();
} else { } else {
@ -249,11 +263,9 @@ void OsgWidget::OnPresetModelDropped(const QString& modelType, const QString& mo
} }
osg::Viewport* vp = view_->getCamera()->getViewport(); osg::Viewport* vp = view_->getCamera()->getViewport();
// 将屏幕坐标转换为世界坐标
double longitude, latitude, height; double longitude, latitude, height;
if (!ScreenToWorldCoordinate(static_cast<int>(position.x()), static_cast<int>(vp->height() - position.y()), longitude, latitude, height)) { if (!ScreenToWorldCoordinate(static_cast<int>(position.x()), static_cast<int>(vp->height() - position.y()), longitude, latitude, height)) {
LOG_WARN("OsgWidget::OnPresetModelDropped - Failed to convert screen coordinates to world coordinates"); LOG_WARN("OsgWidget::OnPresetModelDropped - Failed to convert screen coordinates to world coordinates");
// 使用默认位置
longitude = 0.0; longitude = 0.0;
latitude = 0.0; latitude = 0.0;
height = 0.0; height = 0.0;

View File

@ -11,12 +11,14 @@ class OsgWidget : public QWidget, public osgViewer::CompositeViewer {
public: public:
OsgWidget(QWidget *parent = nullptr, Qt::WindowFlags f = nullptr); OsgWidget(QWidget *parent = nullptr, Qt::WindowFlags f = nullptr);
~OsgWidget() override; ~OsgWidget() override;
QPaintEngine* paintEngine() const override { return nullptr; } QPaintEngine* paintEngine() const override { return nullptr; }
void Initialize(void); void Initialize(void);
void Uninitialize(void); void Uninitialize(void);
void LoadDefaultScene(void); void LoadDefaultScene(void);
void AttachDock(class DockWidget* dockWidget);
signals: signals:
void signalScaleInfo(const QString&); void signalScaleInfo(const QString&);
@ -28,18 +30,11 @@ protected:
void resizeEvent(QResizeEvent* event) override; void resizeEvent(QResizeEvent* event) override;
void paintEvent( QPaintEvent* /*event*/ ) override; void paintEvent( QPaintEvent* /*event*/ ) override;
// 拖拽事件处理
void dragEnterEvent(QDragEnterEvent* event) override; void dragEnterEvent(QDragEnterEvent* event) override;
void dragMoveEvent(QDragMoveEvent* event) override; void dragMoveEvent(QDragMoveEvent* event) override;
void dropEvent(QDropEvent* event) override; void dropEvent(QDropEvent* event) override;
public slots: public slots:
/**
* @brief
* @param modelType
* @param modelName
* @param position
*/
void OnPresetModelDropped(const QString& modelType, const QString& modelName, const QPointF& position = QPointF()); void OnPresetModelDropped(const QString& modelType, const QString& modelName, const QPointF& position = QPointF());
bool ScreenToWorldCoordinate(int x, int y, double& longitude, double& latitude, double& altitude); bool ScreenToWorldCoordinate(int x, int y, double& longitude, double& latitude, double& altitude);