Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
QtQlabel(用作图像容器)全屏错误_Qt_Fullscreen_Qlabel - Fatal编程技术网

QtQlabel(用作图像容器)全屏错误

QtQlabel(用作图像容器)全屏错误,qt,fullscreen,qlabel,Qt,Fullscreen,Qlabel,A在Ubuntu13.04下的Qt4.8.5中遇到了以下错误(我是Qt的nem) 我有一个具有以下结构的应用程序: Mainwondow -CentralWidget --垂直布局 ---TabWidget ---QLabel(使用代码创建并添加到布局中) ---状态栏 在全屏模式下,我隐藏TabWidget和状态栏,然后QLabel停止刷新。(我有一个线程来刷新)奇怪的是,当我恢复TabWidget或状态栏时,它工作正常。如果我在垂直布局中添加1x1像素标签,效果也很好 负责gui更改的插槽

A在Ubuntu13.04下的Qt4.8.5中遇到了以下错误(我是Qt的nem) 我有一个具有以下结构的应用程序:

Mainwondow
-CentralWidget
--垂直布局
---TabWidget
---QLabel(使用代码创建并添加到布局中)
---状态栏

在全屏模式下,我隐藏TabWidget和状态栏,然后QLabel停止刷新。(我有一个线程来刷新)奇怪的是,当我恢复TabWidget或状态栏时,它工作正常。如果我在垂直布局中添加1x1像素标签,效果也很好

负责gui更改的插槽

void Mainview::onToggleFullScreen()
{
    if (this->isFullScreen())
    {
        this->showNormal();
        this->statusbar->show();
        this->tabWidget->show();
    }
    else
    {
        this->showFullScreen();
        this->statusbar->hide();
        this->tabWidget->hide();
    }
}
但我不明白的是,如果我在图像附近放置一个QLabel,它就会工作,如果我将这一行添加到MainWindow构造函数中,它就会停止刷新:

label_10->hide(); //this is the label
你知道有什么问题吗


(提前感谢)

您可能用了错误的方法,但您没有显示代码,我们怎么知道

下面是一个如何做的保险箱。在Qt 4.8和5.1下工作

挑剔:状态栏不应该是
centralWidget()
的一部分
QMainWindow
为您提供了一个
statusBar()

在线程之间传递图像的唯一安全方法是通过
QImage
。除了在GUI线程中,您不能在任何地方使用
QPixmap
。故事到此结束

在下面的例子中,所有重要的事情都发生在幕后。
DrawThing
QObject
位于另一个线程中。此
QThread
run()
方法的默认实现旋转消息循环。这就是计时器可以启动的原因,你需要一个旋转的消息循环

每次生成新图像时,都会通过隐式地将消息发布到
MainWindow
将其传输到GUI线程。该消息由Qt事件循环代码接收,并重新合成为插槽调用。这是因为连接的两端(
DrawThing
MainWindow
实例)位于不同的线程中

Qt的“少代码,多创建”设计方法的优点是:)你越充分利用Qt为你做的事情,你就越不需要担心样板文件

//main.cpp
#include <QMainWindow>
#include <QVBoxLayout>
#include <QStatusBar>
#include <QLabel>
#include <QThread>
#include <QPainter>
#include <QImage>
#include <QApplication>
#include <QBasicTimer>
#include <QPushButton>

class DrawThing : public QObject {
    Q_OBJECT
    int m_ctr;
    QBasicTimer t;
    void timerEvent(QTimerEvent * ev) {
        if (ev->timerId() != t.timerId()) return;
        QImage img(128, 128, QImage::Format_RGB32);
        QPainter p(&img);
        p.translate(img.size().width()/2, img.size().height()/2);
        p.scale(img.size().width()/2, img.size().height()/2);
        p.eraseRect(-1, -1, 2, 2);
        p.setBrush(Qt::NoBrush);
        p.setPen(QPen(Qt::black, 0.05));
        p.drawEllipse(QPointF(), 0.9, 0.9);
        p.rotate(m_ctr*360/12);
        p.setPen(QPen(Qt::red, 0.1));
        p.drawLine(0, 0, 0, 1);
        m_ctr = (m_ctr + 1) % 12;
        emit newImage(img);
    }
public:
    explicit DrawThing(QObject *parent = 0) : QObject(parent), m_ctr(0) { t.start(1000, this); }
    Q_SIGNAL void newImage(const QImage &);
};

class MainWindow : public QMainWindow {
    Q_OBJECT
    QLabel *m_label;
public:
    explicit MainWindow(QWidget *parent = 0, Qt::WindowFlags flags = 0) : QMainWindow(parent, flags) {
        QWidget * cw = new QWidget;
        QTabWidget * tw = new QTabWidget();
        QVBoxLayout * l = new QVBoxLayout(cw);
        l->addWidget(tw);
        l->addWidget(m_label = new QLabel("Label"));
        setCentralWidget(cw);
        QPushButton * pb = new QPushButton("Toggle Status Bar");
        tw->addTab(pb, "Tab 1");
        connect(pb, SIGNAL(clicked()), SLOT(toggleStatusBar()));
        statusBar()->showMessage("The Status Bar");
    }
    Q_SLOT void setImage(const QImage & img) {
        m_label->setPixmap(QPixmap::fromImage(img));
    }
    Q_SLOT void toggleStatusBar() {
        statusBar()->setHidden(!statusBar()->isHidden());
    }
};

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    QThread t;
    DrawThing thing;
    MainWindow w;
    thing.moveToThread(&t);
    t.start();
    w.connect(&thing, SIGNAL(newImage(QImage)), SLOT(setImage(QImage)));
    w.show();
    t.connect(&a, SIGNAL(aboutToQuit()), SLOT(quit()));
    int rc = a.exec();
    t.wait();
    return rc;
}

#include "main.moc"

//main.cpp
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
类DrawThing:公共QObject{
Q_对象
国际中心;
qbasictimert;
无效时间预览(QTimerEvent*ev){
如果(ev->timerId()!=t.timerId())返回;
QImage img(128,128,QImage::Format_RGB32);
QPainter p&img;
p、 平移(img.size().width()/2,img.size().height()/2);
p、 刻度(img.size().width()/2,img.size().height()/2);
p、 eraserrect(-1,-1,2,2);
p、 挫折(Qt::NoBrush);
p、 setPen(QPen(Qt::黑色,0.05));
p、 抽屉式(QPointF(),0.9,0.9);
p、 旋转(m_中心*360/12);
p、 setPen(QPen(Qt::红色,0.1));
p、 抽绳(0,0,0,1);
m_ctr=(m_ctr+1)%12;
发射新图像(img);
}
公众:
显式DrawThing(QObject*parent=0):QObject(parent),m_ctr(0){t.start(1000,this);}
Q_信号无效新图像(const QImage&);
};
类主窗口:公共QMainWindow{
Q_对象
QLabel*m_标签;
公众:
显式主窗口(QWidget*parent=0,Qt::WindowFlags flags=0):QMainWindow(parent,flags){
QWidget*cw=新的QWidget;
QTabWidget*tw=新的QTabWidget();
QVBoxLayout*l=新的QVBoxLayout(cw);
l->addWidget(tw);
l->addWidget(m_标签=新的QLabel(“标签”);
setCentralWidget(cw);
QPushButton*pb=新建QPushButton(“切换状态栏”);
tw->addTab(pb,“表1”);
连接(pb,信号(点击()),插槽(切换状态栏());
statusBar()->showMessage(“状态栏”);
}
Q_插槽无效设置映像(常量图像和img){
m_label->setPixmap(QPixmap::fromImage(img));
}
Q_插槽无效切换状态栏(){
statusBar()->setHidden(!statusBar()->isHidden());
}
};
int main(int argc,char*argv[])
{
质量保证申请a(argc、argv);
qt线程;
拖拉物;
主窗口w;
thing.moveToThread(&t);
t、 start();
w、 连接(&thing,信号(newImage(QImage)),插槽(setImage(QImage));
w、 show();
t、 连接(&a),信号(aboutToQuit()),插槽(quit());
int rc=a.exec();
t、 等待();
返回rc;
}
#包括“main.moc”

如何调用
QLabel::setPixmap
:通过信号/插槽连接,或作为另一个线程中的直接调用?我使用QPaint进行连续渲染,并将setPixmap设置为单个图像。setPixmap直接调用,但该过程通过EventOccessed/eventreceived signal/slot连接进行通信。请显示负责GUI更改的代码。该代码非常大,可以在此处发布,但我尝试以最小的大小复制错误。这就是问题:一旦开始最小化代码,就会发现错误所在。我可以补充说,快点。在任何情况下。这节省了每个人的时间,因为不必等待其他人来解决:)你需要一个C++代码文件,然后如果你使用QML,你需要一个或多个QML文件。这就是全部。不要麻烦处理.h文件或其他任何东西。上面的代码需要将其放入文件夹,运行
qmake-project
,然后运行
qmake
make
。再简单不过了!