добавить кнопку в верхней части qglwidget

Я добавляю кнопку в верхней части моего qglwidget. Изображение значка кнопки инструмента круглое, за исключением прозрачного края. Но после кодирования и отображения виджета сторона кнопки становится черной.

мой результат

Какую работу я должен сделать, чтобы сделать край прозрачным? Моя платформа Qt 5.3.2 MSVC2010. Я хочу получить этот пример в качестве моей конечной цели

MyQGLWidget.cpp:

void WorldView::initializeGL()
{
    loadGLTexture();
    glEnable(GL_TEXTURE_2D);
    glShadeModel(GL_SMOOTH); // 启用阴影平滑
    glClearColor(0.0f, 0.0f, 1.0f, 0.0f); // 蓝色背景
    glClearDepth(1.0f); // 设置深度缓存
    glEnable(GL_DEPTH_TEST); // 启用深度测试
    glDepthFunc(GL_LEQUAL); // 所作深度测试的类型
    glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);  // 告诉系统对透视进行修正
}

void WorldView::resizeGL(int width, int height)
{
    if (height == 0) { // 防止被零除
        height = 1; // 将高设为1
    }

    glViewport(0, 0, width, height); //重置当前的视口
    glMatrixMode(GL_PROJECTION);// 选择投影矩阵
    glLoadIdentity();// 重置投影矩阵
    //设置视口的大小
    gluPerspective(45.0f, (GLfloat)width/(GLfloat)height, 0.1f, 100.0f); //透视投影

    glMatrixMode(GL_MODELVIEW); //选择模型观察矩阵
    glLoadIdentity(); // 重置模型观察矩阵
}

void WorldView::paintGL()
{
    // is empty
}

Мое Главное Окно:

void MyMainWindow::createUiElements()
{
    int nXStart, nYStart;
    int nWidth,  nHeight;
    // set main window size
    nXStart = (QApplication::desktop()->width()  - WIN1_WIDTH)/2;
    nYStart = (QApplication::desktop()->height() - WIN1_HEIGHT)/2;
    setGeometry(nXStart,nYStart,1024,768);
    // add opengl widget to ui
    mpWorldView = new WorldView(this);
    mpWorldView->setGeometry(0,0,WIN1_WIDTH,WIN1_HEIGHT);
    // add more options button to ui
    mpBtnMoreOptions = new QToolButton(this);
    nWidth  = 56;
    nHeight = 56;
    nXStart = this->width() - nWidth - 20;
    nYStart = this->height() - nHeight - 20;
    mpBtnMoreOptions->setGeometry(nXStart, nYStart, nWidth, nHeight);
    mpBtnMoreOptions->setIconSize(QSize(56,56));
    mpBtnMoreOptions->setIcon(QIcon("./icons/ic_more.png"));
    mpBtnMoreOptions->setAutoRaise(true);
}

person Joe    schedule 28.11.2018    source источник


Ответы (1)


Возможно, вы сможете явно указать эллиптическую геометрию, которую хотите использовать, используя QWidget::setMask (которую наследует QToolButton), я не тестировал ее вместе с setIcon, но она работает без нее, поэтому, возможно, стоит попробовать. Вы можете сделать это с чем-то вроде

QRect rect(nXStart, nYStart, nWidth, nHeight);
QRegion region(rect, QRegion::Ellipse);
mpBtnMoreOptions -> setMask(region);

Я не проверял это, так что никаких гарантий.

Редактировать

Вот более полный пример с некоторыми исправлениями, чтобы получить правильную геометрию региона.

QMainWindow* main = new QMainWindow;
QWidget *central = new QWidget;

QToolButton* tool = new QToolButton(central);
int nWidth = 100;
int nHeight = 100;
int nXStart = 10;
int nYStart = 10;
QRect rect(nXStart, nYStart, nWidth/2, nHeight/2);
tool->setGeometry(rect);
rect.setRect(0, 0, nWidth/2, nHeight/2);    // Region needs to start at (0,0)
QRegion region(rect, QRegion::Ellipse);
tool->setMask(region);
tool->setIconSize(QSize(100, 100));
tool->setIcon(QIcon(":/Test/icon"));
tool->setAutoRaise(true);

main->setCentralWidget(central);
main->resize(600, 400);
main->show();

Выход

Вывод

person William Miller    schedule 28.11.2018
comment
tool-›setMask(region);“ работает. Большое спасибо. Но есть еще проблемы. изображение . Отличие моего от вашего в виджете под кнопкой. Виджет в моем примере — qglwidget, у вас — mainwindow. - person Joe; 28.11.2018
comment
Вы можете попробовать установить rect на (1, 1, nWidth/2 -1, nHeight/2 - 1), если это где-то не по одному, что вызывает черную рамку, это исправит это, в противном случае, возможно, попробуйте tool->setStyleSheet(“border: none”). Это единственные две вещи, о которых я могу думать в данный момент. - person William Miller; 28.11.2018
comment
Изображение, которое я только что опубликовал, является результатом написания setStyleSheet("border: none"). - person Joe; 28.11.2018
comment
Похоже, что этот край вызван тем, что QToolButton думает, что ему нужно покрыть больше, чем на самом деле, из-за поведения QButton при наведении/фокусе. Чтобы исправить это, я думаю, вам, возможно, придется создать подкласс QToolButton и переопределить или отключить поведение наведения. Внезапно я не знаю, как именно это сделать, но это не должно быть слишком сложно. - person William Miller; 28.11.2018
comment
Проблема решена. Способ заключается в переносе Qt 5.3.2 в Qt 5.6.3 и QGLWidget в QOpenGLWidget. Некоторые документы в Интернете говорят, что могут быть некоторые проблемы с отображением, когда компоненты сложены, поэтому я пытаюсь, и это работает. - person Joe; 29.11.2018
comment
С помощью метода, описанного в этом ответе, или без использования маски? - person William Miller; 29.11.2018
comment
Нет. Другой допустимый способ — использовать qt quick на Qt 5.3.2. Я попробовал быстрый пример qt какого-то парня, и это тоже нормально. - person Joe; 29.11.2018