Я попробовал это, воссоздав простой проект и скопировав его в код, превратив его в «Qt Designer Form Class» (что, я думаю, вы тоже сделали), и воссоздал ту же ошибку, что и вы.
Но, глядя на пример кода, на самом деле это не QDialog , а скорее QObject , то есть класс, производный от основного базового класса Qt (QObject
). Так что его не следует использовать таким образом.
Я посмотрел код и увидел следующие строки в конструкторе:
FrameLess::FrameLess(QWidget *target) :_target(target),_cursorchanged(false),_leftButtonPressed(false),_borderWidth(5),_dragPos(QPoint()), ui(new Ui::FrameLess)
{
// ui->setup(this);
_target->setMouseTracking(true);
_target->setWindowFlags(Qt::FramelessWindowHint);
_target->setAttribute(Qt::WA_Hover);
_target->installEventFilter(this);
_rubberband = new QRubberBand(QRubberBand::Rectangle);
}
Как видно, этот класс принимает целевой виджет, а модифицирует этот виджет, делая его безрамным (например, путем установки соответствующих оконных флагов, атрибутов и т. Д.). Таким образом, правильный вариант использования будет примерно таким в классе, где вы хотите его использовать:
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
new FrameLess(this);
}
Вызов конструктора (new Frameless(this)
) изменит объект, который вы передаете ему таким образом.
Итак, чтобы ваш пример работал, либо воссоздайте его в Qt Creator как обычный QObject -приобретенный класс, либо просто выполните быстрый тест, удалите из этой части конструктор:
FrameLess::FrameLess(QWidget *target) :_target(target),_cursorchanged(false),_leftButtonPressed(false),_borderWidth(5),_dragPos(QPoint()), ui(new Ui::FrameLess)
... часть , ui(new Ui::FrameLess)
там в конце. То есть не назначайте ничего члену класса ui
.
В файле .h
удалите эту часть:
private:
QWidget *_target = nullptr;
QRubberBand *_rubberband = nullptr;
bool _cursorchanged;
bool _leftButtonPressed;
Edges _mousePress = Edge::None;
Edges _mouseMove = Edge::None;
int _borderWidth;
Ui::FrameLess *ui; // <- remove this
QPoint _dragPos;
bool _dragStart = false;
Сделав эти изменения, я мог бы заставить ваш пример работать, но, вероятно, лучше воссоздать его / удалить диалог frameless.ui
из вашего проекта - он все равно не используется, поэтому лучше просто удалить его.
Надеюсь, это поможет! : -)