create widget-level APIs
This commit is contained in:
parent
dd0aa92035
commit
7d29ee5b95
|
@ -19,6 +19,8 @@ set(CMAKE_AUTORCC ON)
|
||||||
|
|
||||||
find_package(QT NAMES Qt6 Qt5 COMPONENTS Gui REQUIRED)
|
find_package(QT NAMES Qt6 Qt5 COMPONENTS Gui REQUIRED)
|
||||||
find_package(Qt${QT_VERSION_MAJOR} COMPONENTS Gui REQUIRED)
|
find_package(Qt${QT_VERSION_MAJOR} COMPONENTS Gui REQUIRED)
|
||||||
|
find_package(QT NAMES Qt6 Qt5 COMPONENTS Widgets)
|
||||||
|
find_package(Qt${QT_VERSION_MAJOR} COMPONENTS Widgets)
|
||||||
find_package(QT NAMES Qt6 Qt5 COMPONENTS Quick)
|
find_package(QT NAMES Qt6 Qt5 COMPONENTS Quick)
|
||||||
find_package(Qt${QT_VERSION_MAJOR} COMPONENTS Quick)
|
find_package(Qt${QT_VERSION_MAJOR} COMPONENTS Quick)
|
||||||
|
|
||||||
|
|
|
@ -8,7 +8,7 @@
|
||||||
|
|
||||||
FRAMELESSHELPER_USE_NAMESPACE
|
FRAMELESSHELPER_USE_NAMESPACE
|
||||||
|
|
||||||
FLWindow::FLWindow(QWidget *parent) : QWidget(parent)
|
FLWindow::FLWindow(QWidget *parent) : FramelessWindow<QWidget>(parent)
|
||||||
{
|
{
|
||||||
setWindowFlags(Qt::FramelessWindowHint);
|
setWindowFlags(Qt::FramelessWindowHint);
|
||||||
setupUi();
|
setupUi();
|
||||||
|
@ -21,52 +21,6 @@ FLWindow::~FLWindow()
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void FLWindow::initFramelessWindow()
|
|
||||||
{
|
|
||||||
m_helper = new FramelessHelper(windowHandle());
|
|
||||||
m_helper->setResizeBorderThickness(4);
|
|
||||||
m_helper->setTitleBarHeight(m_titleBarWidget->height());
|
|
||||||
m_helper->setResizable(true);
|
|
||||||
m_helper->setHitTestVisible(m_minimizeButton);
|
|
||||||
m_helper->setHitTestVisible(m_maximizeButton);
|
|
||||||
m_helper->setHitTestVisible(m_closeButton);
|
|
||||||
m_helper->install();
|
|
||||||
|
|
||||||
#ifdef Q_OS_MAC
|
|
||||||
m_minimizeButton->hide();
|
|
||||||
m_maximizeButton->hide();
|
|
||||||
m_closeButton->hide();
|
|
||||||
Utilities::setStandardWindowButtonsVisibility(windowHandle(), true);
|
|
||||||
auto btnGroupSize = Utilities::standardWindowButtonsSize(windowHandle());
|
|
||||||
Utilities::setStandardWindowButtonsPosition(windowHandle(),
|
|
||||||
QPoint(12, (m_titleBarWidget->height() - btnGroupSize.height())/2));
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
void FLWindow::showEvent(QShowEvent *event)
|
|
||||||
{
|
|
||||||
QWidget::showEvent(event);
|
|
||||||
|
|
||||||
static bool inited = false;
|
|
||||||
if (!inited) {
|
|
||||||
inited = true;
|
|
||||||
initFramelessWindow();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifdef Q_OS_WIN
|
|
||||||
bool FLWindow::nativeEvent(const QByteArray &eventType, void *message, long *result)
|
|
||||||
{
|
|
||||||
if (!m_helper)
|
|
||||||
return QWidget::nativeEvent(eventType, message, result);
|
|
||||||
|
|
||||||
if (m_helper->handleNativeEvent(this->windowHandle(), eventType, message, result))
|
|
||||||
return true;
|
|
||||||
else
|
|
||||||
return QWidget::nativeEvent(eventType, message, result);
|
|
||||||
}
|
|
||||||
#endif // Q_OS_WIN
|
|
||||||
|
|
||||||
void FLWindow::setupUi()
|
void FLWindow::setupUi()
|
||||||
{
|
{
|
||||||
resize(800, 600);
|
resize(800, 600);
|
||||||
|
@ -113,4 +67,11 @@ void FLWindow::setupUi()
|
||||||
mainLayout->addWidget(m_titleBarWidget);
|
mainLayout->addWidget(m_titleBarWidget);
|
||||||
mainLayout->addStretch();
|
mainLayout->addStretch();
|
||||||
setLayout(mainLayout);
|
setLayout(mainLayout);
|
||||||
|
|
||||||
|
setResizeBorderThickness(4);
|
||||||
|
setTitleBarHeight(m_titleBarWidget->height());
|
||||||
|
setResizable(true);
|
||||||
|
setHitTestVisible(m_minimizeButton);
|
||||||
|
setHitTestVisible(m_maximizeButton);
|
||||||
|
setHitTestVisible(m_closeButton);
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,29 +1,21 @@
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include <QWidget>
|
#include <QWidget>
|
||||||
#include "core/framelesshelper.h"
|
#include "widget/framelesswindow.h"
|
||||||
|
|
||||||
class QPushButton;
|
class QPushButton;
|
||||||
|
|
||||||
class FLWindow : public QWidget
|
class FLWindow : public __flh_ns::FramelessWindow<QWidget>
|
||||||
{
|
{
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
public:
|
public:
|
||||||
explicit FLWindow(QWidget *parent = nullptr);
|
explicit FLWindow(QWidget *parent = nullptr);
|
||||||
~FLWindow();
|
~FLWindow() override;
|
||||||
|
|
||||||
protected:
|
|
||||||
void showEvent(QShowEvent *event) override;
|
|
||||||
#ifdef Q_OS_WIN
|
|
||||||
bool nativeEvent(const QByteArray &eventType, void *message, long *result) override;
|
|
||||||
#endif // Q_OS_WIN
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void initFramelessWindow();
|
|
||||||
void setupUi();
|
void setupUi();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
__flh_ns::FramelessHelper *m_helper = nullptr;
|
|
||||||
QWidget *m_titleBarWidget = nullptr;
|
QWidget *m_titleBarWidget = nullptr;
|
||||||
QPushButton *m_minimizeButton = nullptr;
|
QPushButton *m_minimizeButton = nullptr;
|
||||||
QPushButton *m_maximizeButton = nullptr;
|
QPushButton *m_maximizeButton = nullptr;
|
||||||
|
|
|
@ -8,6 +8,13 @@ set(SOURCES
|
||||||
core/framelesswindowsmanager.cpp
|
core/framelesswindowsmanager.cpp
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
if(TARGET Qt${QT_VERSION_MAJOR}::Widgets)
|
||||||
|
list(APPEND SOURCES
|
||||||
|
widget/framelesswindow.h
|
||||||
|
)
|
||||||
|
endif()
|
||||||
|
|
||||||
if(TARGET Qt${QT_VERSION_MAJOR}::Quick)
|
if(TARGET Qt${QT_VERSION_MAJOR}::Quick)
|
||||||
list(APPEND SOURCES
|
list(APPEND SOURCES
|
||||||
quick/framelessquickhelper.h
|
quick/framelessquickhelper.h
|
||||||
|
@ -94,6 +101,12 @@ if(TARGET Qt${QT_VERSION_MAJOR}::Quick)
|
||||||
)
|
)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
if(TARGET Qt${QT_VERSION_MAJOR}::Widgets)
|
||||||
|
target_link_libraries(${PROJECT_NAME} PRIVATE
|
||||||
|
Qt${QT_VERSION_MAJOR}::WidgetsPrivate
|
||||||
|
)
|
||||||
|
endif()
|
||||||
|
|
||||||
target_include_directories(${PROJECT_NAME} PUBLIC
|
target_include_directories(${PROJECT_NAME} PUBLIC
|
||||||
"$<BUILD_INTERFACE:${CMAKE_CURRENT_LIST_DIR}>"
|
"$<BUILD_INTERFACE:${CMAKE_CURRENT_LIST_DIR}>"
|
||||||
)
|
)
|
||||||
|
|
|
@ -0,0 +1,76 @@
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <QtWidgets/qwidget.h>
|
||||||
|
|
||||||
|
#include "core/framelesshelper.h"
|
||||||
|
|
||||||
|
FRAMELESSHELPER_BEGIN_NAMESPACE
|
||||||
|
|
||||||
|
template <typename T>
|
||||||
|
class FramelessWindow : public T
|
||||||
|
{
|
||||||
|
static_assert(std::is_base_of<QWidget, T>::value, "T must inherit from QWidget");
|
||||||
|
|
||||||
|
public:
|
||||||
|
explicit FramelessWindow(QWidget *parent = nullptr)
|
||||||
|
: T(parent), m_helper(new FramelessHelper) {}
|
||||||
|
|
||||||
|
~FramelessWindow() {
|
||||||
|
delete m_helper;
|
||||||
|
}
|
||||||
|
|
||||||
|
FramelessHelper *helper() { return m_helper; }
|
||||||
|
|
||||||
|
void setResizable(bool reziable)
|
||||||
|
{
|
||||||
|
m_helper->setResizable(reziable);
|
||||||
|
}
|
||||||
|
|
||||||
|
void setHitTestVisible(QObject *obj)
|
||||||
|
{
|
||||||
|
m_helper->setHitTestVisible(obj);
|
||||||
|
}
|
||||||
|
|
||||||
|
void setResizeBorderThickness(int thickness) {
|
||||||
|
m_helper->setResizeBorderThickness(thickness);
|
||||||
|
}
|
||||||
|
|
||||||
|
void setTitleBarHeight(int height)
|
||||||
|
{
|
||||||
|
m_helper->setTitleBarHeight(height);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected:
|
||||||
|
void showEvent(QShowEvent *event) override
|
||||||
|
{
|
||||||
|
T::showEvent(event);
|
||||||
|
|
||||||
|
if (!m_initied) {
|
||||||
|
const auto win = this->windowHandle();
|
||||||
|
if (win) {
|
||||||
|
m_helper->setWindow(win);
|
||||||
|
m_helper->install();
|
||||||
|
m_initied = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef Q_OS_WIN
|
||||||
|
bool nativeEvent(const QByteArray &eventType, void *message, long *result) override
|
||||||
|
{
|
||||||
|
if (!m_helper)
|
||||||
|
return T::nativeEvent(eventType, message, result);
|
||||||
|
|
||||||
|
if (m_helper->handleNativeEvent(this->windowHandle(), eventType, message, result))
|
||||||
|
return true;
|
||||||
|
else
|
||||||
|
return T::nativeEvent(eventType, message, result);
|
||||||
|
}
|
||||||
|
#endif // Q_OS_WIN
|
||||||
|
|
||||||
|
private:
|
||||||
|
FramelessHelper *m_helper;
|
||||||
|
bool m_initied = false;
|
||||||
|
};
|
||||||
|
|
||||||
|
FRAMELESSHELPER_END_NAMESPACE
|
Loading…
Reference in New Issue