- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我是 Qt 的新手,所以我被 GUI 更新困住了。我有 2 个类:主线程中的 ControlWidget
和单独线程中的 CameraController
。
int main(int argc, char **argv)
{
QApplication app(argc, argv);
CameraController *cameraController = new CameraController;;
ControlWidget *main_window = new ControlWidget;
Thread getImageThread;
cameraController->moveToThread(&getImageThread);
getImageThread.start();
QTimer get_images_timer;
QObject::connect(&get_images_timer, SIGNAL(timeout()), cameraController, SLOT(onTimerOut()), Qt::QueuedConnection);
QObject::connect(cameraController, SIGNAL(sendLabel(QImage)), main_window, SLOT(getImage(QImage)), Qt::QueuedConnection);
QObject::connect(&get_images_timer, SIGNAL(timeout()), main_window, SLOT(update()), Qt::QueuedConnection);
get_images_timer.start(2000);
app.exec();
return 0;
}
所以我想每 2 秒从相机线程获取图像并将它们发送到主线程(这确实发生了,所以我在 main_window 对象上有 QImage
)。然后我想把这个QImage放到cam1和cam2QLabel
。我被困在这里:
首先:当我使用 setPixmap()
方法时,QLabel.width()
和 QLabel.height()
与 不同>image.width()
和 image.height()
或 pixmap.width()
和 pixmap.height()
。
第二:我无法想象QLabel
。如果我执行 this->ImageLayout->addWidget(cam1)
什么都不会发生。 this->update
也没有帮助。
我应该有一个额外的 worker 来更新 GUI 吗?我究竟做错了什么?
更多信息的源代码:
CameraController.h
class CameraController : public QObject
{
Q_OBJECT
private:
CoreApi::InstanceHandle g_hApi;
CoreApi::DeviceCollectionHandle hDeviceCollection;
CoreApi::DeviceHandle hDevice;
CoreApi::CameraPortHandle first_cam;
Common::FrameHandle frame;
QPixmap pixmap;
QImage image;
public:
CameraController();
~CameraController();
QLabel outLabel;
public slots:
void onTimerOut();
signals:
QImage sendLabel(QImage image);
};
相机 Controller .cpp
CameraController::CameraController()
{
try
{
this->g_hApi = CoreApi::Instance::initialize();
this->hDeviceCollection = this->g_hApi->deviceCollection();
this->hDevice = hDeviceCollection->device(0);
this->first_cam = hDevice->cameraPort(0);
first_cam->autoConfigure();
first_cam->liveStart();
}
catch (GeneralException& e)
{
std::cout << e.what() << std::endl;
}
}
CameraController::~CameraController()
{
}
void CameraController::onTimerOut()
{
if (this->first_cam->liveFrameReady())
{
this->frame = first_cam->liveFrame();
this->image = QImage((uchar*)this->frame->buffer()->data(), this->frame->dataType()->width(), this->frame->dataType()->height(), QImage::Format::Format_RGB888);
this->image = this->image.scaled(QSize(this->image.width()/10, this->image.height()/10));
std::cout << "width = "<<this->image.width() << "height = " << this->image.height() << std::endl;
emit sendLabel(this->image.copy());
}
}
控件控件.h
class ControlWidget :public QDialog
{
Q_OBJECT
private:
QGLCanvas *osCanvas;
QGridLayout *mainLayout;
QGridLayout *buttonLayout;
QVBoxLayout *imageLayout, *settingsLayout;
QHBoxLayout *controlLayout;
QListWidget *cameraListWidget, *devicesListWidget;
QLabel *cameraListLabel, *devicesListLabel, *cameraSettingsLabel, *fpsLabel, *shutterLabel;
QHBoxLayout *fpsLayout, *shutterLayout;
QLineEdit *fpsEdit, *shutterEdit;
QPushButton *saveButton, *saveSettingButton, *applySettingsButton, *chooseFolderButton;
QTimer* m_timer;
public:
ControlWidget(QWidget *parent = 0);
~ControlWidget();
QLabel *cam1, *cam2;
QImage *camera_1, *camera_2;
void createWidgets();
public slots:
void getImage(QImage new_frame);
void displayImages();
signals:
void images_loaded();
private slots:
void onTimeout()
{
qDebug() << "Worker::onTimeout get called from controlWidget timer and ?: " << QThread::currentThreadId();
};
};
控件控件.cpp
ControlWidget::ControlWidget(QWidget *parent)
{
this->createWidgets();
this->m_timer = new QTimer;
connect(this->m_timer, SIGNAL(timeout()),this, SLOT(update()));
m_timer->start(1000);
}
ControlWidget::~ControlWidget()
{
delete this->mainLayout;
}
void ControlWidget::createWidgets()
{
this->imageLayout = new QVBoxLayout;
this->cam1 = new QLabel;
this->cam2 = new QLabel;
this->imageLayout->addWidget(cam1);
this->imageLayout->addWidget(cam2);
this->setLayout(this->imageLayout);
this->show();
}
void ControlWidget::displayImages()
{
QLabel tmp_label ;
std::cout << "********************************************************************************" << std::endl;
std::cout <<" camera height = " <<this->camera_1->height() << " camera width = " << this->camera_1->width() << std::endl;
std::cout << "********************************************************************************" << std::endl;
QPixmap tmp_pixmap = QPixmap::fromImage(this->camera_1->copy());
std::cout << "PIXMAP WIDTH = " << tmp_pixmap.width() << "Pixmap Height = " << tmp_pixmap.height() <<std::endl;
std::cout << "LABELWIDTH = "<< tmp_label.width() << "LabelHeight = "<< tmp_label.height() << std::endl;
tmp_label.setGeometry(200, 200, tmp_pixmap.width(), tmp_pixmap.height());
tmp_label.show();
this->cam1 = &tmp_label;
this->cam2 = &tmp_label;
std::cout << "CAM1 Width = " <<this->cam1->width() << std::endl;
this->imageLayout->addWidget(this->cam1);
this->imageLayout->addWidget(this->cam2);
}
void ControlWidget::getImage(QImage img)
{
std::cout << "********************************************************************************" << std::endl;
std::cout << " img height = " << img.height() << " img width = " << img.width() << std::endl;
std::cout << "********************************************************************************" << std::endl;
this->camera_1 = &QImage(img);
this->camera_2 = &QImage(img);
this->displayImages();
}
最佳答案
好的,所以这里有一些设计问题:
tmp_label
是在堆栈上创建的,无论如何都会在您的 displayImages
方法结束时销毁
每次收到新的相机帧时,您都在尝试使用 this->imageLayout->addWidget(this->cam1);
将 QLabel 添加回您的 UI。在构建小部件时添加一次,然后仅使用 cam1->setPixmap(...)
。
也许我错过了它,但我没有看到您在 QLabel 中设置图像的位置。这通常使用 QLabel::setPixmap
然后:
update()
像您一样依赖标准小部件时应该不是必需的,当您设置其像素图时,QLabel 会自动更新this->
Thread
类下有什么,但是当使用 QThreads 时你不需要为连接传递 Qt::QueuedConnection
参数,这是自动完成QPixmap::save("image.jpg")
或 QImage::save("image.jpg"轻松测试您读取的 QPixmap 和 QImage 的有效性")
关于C++ Qt GUI 更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42935117/
我正在使用 Qt 语言学家翻译一个 ui 文件。我使用 lupdate 获取了它的 ts 文件,并翻译了这些单词和短语。现在我想将它添加到我的代码中,但我从它的教程中发现我似乎必须将 tr() 添加到
我想在 Qt Creator 中创建下面的简单控制台应用程序: #include int main(int argc, char* argv[]) { std::cout #include
我想将 libQtGui.so.4 libQtNetwork.so.4 和 libQtCore.so.4 包含在与我的应用程序所在的目录相同的目录中。我如何让 Qt 理解这一点? y 目的是拥有一个使
我有一个充满 QPushButtons 和 QLabels 以及各种其他有趣的 QWidget 的窗口,所有这些都使用各种 QLayout 对象动态布局...而我想做的是偶尔制作一些这些小部件变得不可
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 这个问题似乎与 help center 中定义的范围内的编程无关。 . 关闭 7 年前。 Improve
我想知道 Qt 是否将下面代码的“版本 1”之类的东西放在堆上?在版本 1 中,Qt 会将 dirStuff 放在堆栈上还是堆上?我问是因为我有一种感觉,Java 将所有数据结构放在堆上......不
这个问题是关于 Qt Installer Framework 2.0 版的。 在这一点上,使用 Qt 安装程序框架的人都知道,如果不进行自定义,您根本无法通过安装程序覆盖现有安装。这样做显然是为了解决
关闭。这个问题是off-topic .它目前不接受答案。 想改善这个问题吗? Update the question所以它是 on-topic对于堆栈溢出。 8年前关闭。 Improve this q
因为我在我的计算机上安装了 Qt 4.8.4 和 Qt 5.1,所以我遇到了问题。 当只有 Qt 4.8.4 存在时,一切都很好。 当我添加 Qt 5.1 时,这个工作正常,但 Qt 4.8.4 给了
我无法在我的 Ubuntu 12 中安装更多软件包。我尝试了 apt-get install -f ,以及许多其他类似的技巧,但在找到解决方案方面没有进展。 这是属于 Qt 的损坏包: 以下包具有未满
我正在尝试使用 Virtual Box 中的 Ubuntu 机器复制我们目前在物理 Ubuntu 服务器上运行的应用程序。它是一个 QT 应用程序,但在服务器上我们使用 NPM 的 pm2 运行它。安
问题: Qt Creator 是用 Qt Creator 构建的吗? 同样,Qt Designer 是用 Qt Designer 构建的吗? 顺便说一句,为什么有两个 Qt IDE?他们是竞争对手吗?
当我使用 QWidget设计用户界面时,我总是对它的大小属性有点困惑。有size policy , geometry和 hintSize . 我只知道size policy之间的关系和 hintSiz
就目前而言,这个问题不适合我们的问答形式。我们希望答案得到事实、引用资料或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the
我想知道是否有一种很好的方法可以让用户像 LabView 一样创建节点图(有限制)。 像这样的东西: 我见过http://www.pyqtgraph.org/ ,这似乎有类似的东西,我确实打算使用 P
在 Qt 中是否有一种跨平台的方式来获得用户喜欢的固定宽度和比例字体? 例如,在 cocoa 中,有 NSFont *proportional = [NSFont userFontOfSize:12.
我想使用 Qt 和 C++ 制作这样的交互式图表:http://jsxgraph.uni-bayreuth.de/wiki/index.php/Cubic_spline_interpolation 关
我正在编写一个嵌入式设备屏幕的模拟(其中包含主 QWidget 顶部的自定义小部件),虽然屏幕的原始尺寸是 800x600,但我希望能够按比例放大和缩小它拖动窗口的角。如果不使用网格布局和担架(不会向
在下面的示例中,我是否必须从堆中删除对象?如果是的话,怎么办? #include #include #include #include #include int main(int argc,
来自 Web 开发背景,我现在进入 QT 应用程序开发。 使用 QFonts 我已经看到我显然只有两个选择,在 QT 中定义字体大小;按像素大小或点大小。 在制作网页布局时,我习惯于以相对方式定义所有
我是一名优秀的程序员,十分优秀!