【发布时间】:2021-02-08 10:22:15
【问题描述】:
我是 QT 的新手,在 Ubuntu 平台上使用它的 openGL
我已经创建了一个模板:
我的目标:
点击“计算”按钮后,应该会发生两件事:
- 文本框中将打印一个文本
- 会在expOutput上画一条线,expOutput是Experimental的一个对象,继承自QGLWidget。
我正在创建两个信号槽。程序代码如下:
nearestneighbour.h
#ifndef NEARESTNEIGHBOUR_H
#define NEARESTNEIGHBOUR_H
#include <QWidget>
#include <QGLWidget>
#include "experimental.h"
namespace Ui {
class NearestNeighbour;
}
class NearestNeighbour : public QWidget
{
Q_OBJECT
public:
explicit NearestNeighbour(QWidget *parent = 0);
~NearestNeighbour();
signals:
void clicked();
private slots:
void on_Compute_clicked();
private:
Ui::NearestNeighbour *ui;
};
#endif // NEARESTNEIGHBOUR_H
nearestneighbour.cpp
#include "nearestneighbour.h"
#include "ui_nearestneighbour.h"
NearestNeighbour::NearestNeighbour(QWidget *parent) :
QWidget(parent),
ui(new Ui::NearestNeighbour)
{
//expt = new Experimental(this);
ui->setupUi(this);
QObject::connect(ui->Compute, &QPushButton::clicked, ui->expOutput,&Experimental::draw);
QObject::connect(ui->Compute, &QPushButton::clicked, this,&NearestNeighbour::on_Compute_clicked);
}
NearestNeighbour::~NearestNeighbour()
{
delete ui;
}
void NearestNeighbour::on_Compute_clicked()
{
ui->textEdit->setText("Hello World !!");
}
experimental.h
#ifndef EXPERIMENTAL_H
#define EXPERIMENTAL_H
#include <QWidget>
#include <QGLWidget>
#include <iostream>
#include "nearestneighbour.h"
// #include "ui_nearestneighbour.h"
class Experimental : public QGLWidget
{
Q_OBJECT
public:
explicit Experimental(QWidget *parent=NULL);
public slots:
void draw(void);
protected:
void initializeGL();
void paintGL();
};
#endif // EXPERIMENTAL_H
experimental.cpp
#include "experimental.h"
Experimental::Experimental(QWidget *parent): QGLWidget(QGLFormat(QGL::SampleBuffers), parent){}
void Experimental::initializeGL(){
std::cout<<"In initializegl !! ";
qglClearColor(Qt::white);
glViewport(0,0,600,300);
glMatrixMode(GL_MODELVIEW);
glOrtho(0,300,0,600,0,0);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
}
void Experimental::paintGL(){
std::cout<<"In paintgl !! ";
}
void Experimental::draw(void){
std::cout<<"In draw !!";
glLoadIdentity();
qglColor(Qt::blue);
glBegin(GL_LINE);
glVertex2i(100,100);
glVertex2i(200,200);
glEnd();
updateGL();
}
问题:
感谢一些很好的建议,我能够消除错误并且系统编译正常。
第一个屏幕的输出为
我点击“计算”按钮,应该在 openGl 小部件上画线。但是没有任何输出,但是退出GUI模式后,可以注意到有一些相关的消息,表明函数已经被访问过。
谁能帮我解决这个问题?
【问题讨论】:
-
为什么experimental.h首先包含ui_nearestneighbour.h?
-
谢谢!!删除 ui_nearestneighbour.h 删除了错误。但是, QObject::connect(ui->Compute, SIGNAL(clicked()), ui->expOutput,SLOT(draw()));在最近的neighbour.cpp 中仍然无法正常工作!
-
不要使用 qt4 风格的信号槽连接,如果这不能显示您需要显示的更多内容。
-
@Botje:我已经更新到 qt5 信号槽方法:QObject::connect(ui->Compute, &QPushButton::clicked, ui->expOutput,&Experimental::draw); QObject::connect(ui->Compute, &QPushButton::clicked, this,&NearestNeighbour::on_Compute_clicked);但是,我的 opengl 小部件中没有显示
-
代码已更新,显示未看到任何输出