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;
splash.showMessage(("正在创建主窗口..."), Qt::AlignHCenter | Qt::AlignBottom, Qt:: white);
// 先显示窗口,再在事件循环启动后最大化,避免首次显示时原生窗口放置未就绪导致尺寸异常
mainWindow.showMaximized();
// QTimer::singleShot(0, &mainWindow, &MainFrame::showMaximized);
mainWindow.show();
QTimer::singleShot(20, &mainWindow, &MainFrame::showMaximized);
splash.finish(&mainWindow);
int ret = app.exec();
// app.Uninit();
Sleep(200);
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.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)) {

View File

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

View File

@ -37,6 +37,8 @@ MainFrame::MainFrame(QWidget *parent) :
{
ui->setupUi(this);
setMinimumSize(800, 600);
assert(nullptr == s_instance);
s_instance = this;
@ -102,13 +104,6 @@ void MainFrame::InitUI() {
FileManagerMenu* fileMenu = new FileManagerMenu(this);
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);
AddMenuWidget("simu_manager", tr("simu manager"), simuRunMenu);
@ -123,11 +118,6 @@ void MainFrame::InitUI() {
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) {
ui->menuWidget->setCurrentIndex(0);
menuWidget_.isEmpty() ? assert(false) : menuWidget_.key(0)->setChecked(true);

View File

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

View File

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

View File

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

View File

@ -21,7 +21,6 @@
#include "OsgViewer.h"
#include "common/SpdLogger.h"
#include "scene/OEScene.h"
#include "ui/MainFrame.h"
#include "workspace/WorkSpaceManager.h"
#include "workspace/WorkSpace.h"
#include "scutcheon/osgScutcheon.h"
@ -33,6 +32,10 @@
#include "entities/Entity.h"
#include "entities/Component.h"
#include "ui/DockTitleBar.h"
#include "ui/DockWidget.h"
#include "ui/MainFrame.h"
static void ConfigureView( osgViewer::View* view ) {
view->addEventHandler(new osgViewer::StatsHandler());
view->addEventHandler(new osgViewer::WindowSizeHandler());
@ -56,13 +59,12 @@ OsgWidget::OsgWidget(QWidget* parent, Qt::WindowFlags f)
setMouseTracking(true);
setKeyEventSetsDone(0);
// 启用拖拽接收
setAcceptDrops(true);
connect( &timer_, SIGNAL(timeout()), this, SLOT(update()) );
timer_.start( 10 );
setMinimumSize(100, 100);
//setMinimumSize(800, 100);
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,
bool windowDecoration) {
osg::DisplaySettings* ds = osg::DisplaySettings::instance().get();
@ -199,7 +214,6 @@ void OsgWidget::dragEnterEvent(QDragEnterEvent* event) {
}
void OsgWidget::dragMoveEvent(QDragMoveEvent* event) {
// 检查是否是预制模型拖拽
if (event->mimeData()->hasFormat("application/x-preset-model")) {
event->acceptProposedAction();
} else {
@ -249,11 +263,9 @@ void OsgWidget::OnPresetModelDropped(const QString& modelType, const QString& mo
}
osg::Viewport* vp = view_->getCamera()->getViewport();
// 将屏幕坐标转换为世界坐标
double 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");
// 使用默认位置
longitude = 0.0;
latitude = 0.0;
height = 0.0;

View File

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