Anonymous
Qresizeevent вызывает Sigsegv
Сообщение
Anonymous » 09 мар 2025, 14:29
Моя цель состоит в том, чтобы использовать класс с именем vallay.h , чтобы добавить прямоугольную коробку и текст поверх виджета (Marblewidget). Здесь ниже мой код для графического интерфейса. Я попытался удалить все ненужные части: < /p>
sstrong> mainwindow.cpp
Код: Выделить всё
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
{
setupUi(this);
}
MainWindow::~MainWindow()
{
}
void MainWindow::resizeEvent(QResizeEvent *event)
{
overlay->resize(event->size()); //////////////// CAUSES SIGSEGV!!!!!!!!!!!!!
event->accept();
}
void MainWindow::setupUi(QMainWindow *MainWindow)
{
MainWindow->showMaximized();
QSizePolicy sizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
sizePolicy.setHorizontalStretch(0);
sizePolicy.setVerticalStretch(0);
sizePolicy.setHeightForWidth(MainWindow->sizePolicy().hasHeightForWidth());
MainWindow->setSizePolicy(sizePolicy);
MainWindow->setTabShape(QTabWidget::Rounded);
QWidget *centralwidget = new QWidget(MainWindow);
centralwidget->setObjectName(QString::fromUtf8("centralwidget"));
sizePolicy.setHeightForWidth(centralwidget->sizePolicy().hasHeightForWidth());
centralwidget->setSizePolicy(sizePolicy);
centralwidget->setLayoutDirection(Qt::LeftToRight);
QGridLayout *gridLayout_4 = new QGridLayout(centralwidget);
gridLayout_4->setObjectName(QString::fromUtf8("gridLayout_4"));
QSplitter *splitter_4 = new QSplitter(centralwidget);
splitter_4->setObjectName(QString::fromUtf8("splitter_4"));
splitter_4->setOrientation(Qt::Horizontal);
QTabWidget *tabWidget_2 = new QTabWidget(splitter_4);
tabWidget_2->setObjectName(QString::fromUtf8("tabWidget_2"));
sizePolicy.setHeightForWidth(tabWidget_2->sizePolicy().hasHeightForWidth());
tabWidget_2->setSizePolicy(sizePolicy);
tabWidget_2->setMaximumSize(QSize(443, 16777));
tabWidget_2->setAutoFillBackground(true);
tabWidget_2->setTabPosition(QTabWidget::West);
tabWidget_2->setTabShape(QTabWidget::Rounded);
tabWidget_2->setIconSize(QSize(30, 16));
QWidget *tab_10 = new QWidget();
tab_10->setObjectName(QString::fromUtf8("tab_10"));
QGridLayout *gridLayout = new QGridLayout(tab_10);
gridLayout->setObjectName(QString::fromUtf8("gridLayout"));
QVBoxLayout *verticalLayout_4 = new QVBoxLayout();
verticalLayout_4->setObjectName(QString::fromUtf8("verticalLayout_4"));
QHBoxLayout *horizontalLayout_7 = new QHBoxLayout();
horizontalLayout_7->setObjectName(QString::fromUtf8("horizontalLayout_7"));
QLabel *label_3 = new QLabel(tab_10);
label_3->setObjectName(QString::fromUtf8("label_3"));
horizontalLayout_7->addWidget(label_3);
verticalLayout_4->addLayout(horizontalLayout_7);
QTreeView *treeView_4 = new QTreeView(tab_10);
treeView_4->setObjectName(QString::fromUtf8("treeView_4"));
QStandardItemModel *standardModel = new QStandardItemModel ;
QStandardItem *rootNode = standardModel->invisibleRootItem();
treeView_4->setModel(standardModel);
verticalLayout_4->addWidget(treeView_4);
gridLayout->addLayout(verticalLayout_4, 0, 0, 1, 1);
tabWidget_2->addTab(tab_10, QString());
treeView_4->raise();
Marble::MarbleWidget* MarbleWidget = new Marble::MarbleWidget(splitter_4);
splitter_4->addWidget(MarbleWidget);
splitter_4->setStretchFactor(0,0);
splitter_4->setStretchFactor(1,6);
gridLayout_4->addWidget(splitter_4, 0, 0, 1, 1);
MainWindow->setCentralWidget(centralwidget);
MarbleWidget->raise();
tabWidget_2->raise();
overlay = new Overlay(MarbleWidget);
overlay->raise();
QMetaObject::connectSlotsByName(MainWindow);
} // setupUi
< /code>
[b] #include
#include
class Overlay : public QWidget
{
public:
Overlay(QWidget *parent);
protected:
void paintEvent(QPaintEvent *event);
};
< /code>
overlay.cpp[/b]
#include "overlay.h"
Overlay::Overlay(QWidget *parent)
: QWidget(parent)
{
setPalette(Qt::transparent);
setAttribute(Qt::WA_TransparentForMouseEvents);
}
void Overlay::paintEvent(QPaintEvent *event)
{
QFont font;
font.setStyleHint(QFont::Helvetica, QFont::PreferAntialias);
font.setPointSize(10);
QPainter painter(this);
painter.setRenderHint(QPainter::Antialiasing);
painter.setPen(QColor(10, 10, 10, 255));
painter.fillRect(QRect(50, 50, 100, 100), QColor(100, 100, 100, 120));
painter.setFont(font);
painter.drawText(20, 20, "hi..............................");
}
Проблема состоит в том, что наложение-> resize (event-> size ()); вызывает sigsegv , когда ядро запускает эту строку. < /p>
Что не так с кодом, как я могу его исправить? < /p>
Подробнее здесь:
https://stackoverflow.com/questions/251 ... es-sigsegv
1741519745
Anonymous
Моя цель состоит в том, чтобы использовать класс с именем vallay.h , чтобы добавить прямоугольную коробку и текст поверх виджета (Marblewidget). Здесь ниже мой код для графического интерфейса. Я попытался удалить все ненужные части: < /p> sstrong> mainwindow.cpp [code]MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) { setupUi(this); } MainWindow::~MainWindow() { } void MainWindow::resizeEvent(QResizeEvent *event) { overlay->resize(event->size()); //////////////// CAUSES SIGSEGV!!!!!!!!!!!!! event->accept(); } void MainWindow::setupUi(QMainWindow *MainWindow) { MainWindow->showMaximized(); QSizePolicy sizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); sizePolicy.setHorizontalStretch(0); sizePolicy.setVerticalStretch(0); sizePolicy.setHeightForWidth(MainWindow->sizePolicy().hasHeightForWidth()); MainWindow->setSizePolicy(sizePolicy); MainWindow->setTabShape(QTabWidget::Rounded); QWidget *centralwidget = new QWidget(MainWindow); centralwidget->setObjectName(QString::fromUtf8("centralwidget")); sizePolicy.setHeightForWidth(centralwidget->sizePolicy().hasHeightForWidth()); centralwidget->setSizePolicy(sizePolicy); centralwidget->setLayoutDirection(Qt::LeftToRight); QGridLayout *gridLayout_4 = new QGridLayout(centralwidget); gridLayout_4->setObjectName(QString::fromUtf8("gridLayout_4")); QSplitter *splitter_4 = new QSplitter(centralwidget); splitter_4->setObjectName(QString::fromUtf8("splitter_4")); splitter_4->setOrientation(Qt::Horizontal); QTabWidget *tabWidget_2 = new QTabWidget(splitter_4); tabWidget_2->setObjectName(QString::fromUtf8("tabWidget_2")); sizePolicy.setHeightForWidth(tabWidget_2->sizePolicy().hasHeightForWidth()); tabWidget_2->setSizePolicy(sizePolicy); tabWidget_2->setMaximumSize(QSize(443, 16777)); tabWidget_2->setAutoFillBackground(true); tabWidget_2->setTabPosition(QTabWidget::West); tabWidget_2->setTabShape(QTabWidget::Rounded); tabWidget_2->setIconSize(QSize(30, 16)); QWidget *tab_10 = new QWidget(); tab_10->setObjectName(QString::fromUtf8("tab_10")); QGridLayout *gridLayout = new QGridLayout(tab_10); gridLayout->setObjectName(QString::fromUtf8("gridLayout")); QVBoxLayout *verticalLayout_4 = new QVBoxLayout(); verticalLayout_4->setObjectName(QString::fromUtf8("verticalLayout_4")); QHBoxLayout *horizontalLayout_7 = new QHBoxLayout(); horizontalLayout_7->setObjectName(QString::fromUtf8("horizontalLayout_7")); QLabel *label_3 = new QLabel(tab_10); label_3->setObjectName(QString::fromUtf8("label_3")); horizontalLayout_7->addWidget(label_3); verticalLayout_4->addLayout(horizontalLayout_7); QTreeView *treeView_4 = new QTreeView(tab_10); treeView_4->setObjectName(QString::fromUtf8("treeView_4")); QStandardItemModel *standardModel = new QStandardItemModel ; QStandardItem *rootNode = standardModel->invisibleRootItem(); treeView_4->setModel(standardModel); verticalLayout_4->addWidget(treeView_4); gridLayout->addLayout(verticalLayout_4, 0, 0, 1, 1); tabWidget_2->addTab(tab_10, QString()); treeView_4->raise(); Marble::MarbleWidget* MarbleWidget = new Marble::MarbleWidget(splitter_4); splitter_4->addWidget(MarbleWidget); splitter_4->setStretchFactor(0,0); splitter_4->setStretchFactor(1,6); gridLayout_4->addWidget(splitter_4, 0, 0, 1, 1); MainWindow->setCentralWidget(centralwidget); MarbleWidget->raise(); tabWidget_2->raise(); overlay = new Overlay(MarbleWidget); overlay->raise(); QMetaObject::connectSlotsByName(MainWindow); } // setupUi < /code> [b] #include #include class Overlay : public QWidget { public: Overlay(QWidget *parent); protected: void paintEvent(QPaintEvent *event); }; < /code> overlay.cpp[/b] #include "overlay.h" Overlay::Overlay(QWidget *parent) : QWidget(parent) { setPalette(Qt::transparent); setAttribute(Qt::WA_TransparentForMouseEvents); } void Overlay::paintEvent(QPaintEvent *event) { QFont font; font.setStyleHint(QFont::Helvetica, QFont::PreferAntialias); font.setPointSize(10); QPainter painter(this); painter.setRenderHint(QPainter::Antialiasing); painter.setPen(QColor(10, 10, 10, 255)); painter.fillRect(QRect(50, 50, 100, 100), QColor(100, 100, 100, 120)); painter.setFont(font); painter.drawText(20, 20, "hi.............................."); } [/code] Проблема состоит в том, что наложение-> resize (event-> size ()); вызывает sigsegv , когда ядро запускает эту строку. < /p> Что не так с кодом, как я могу его исправить? < /p> Подробнее здесь: [url]https://stackoverflow.com/questions/25119297/qresizeevent-causes-sigsegv[/url]