但问题是,我无法到达 ana->ui->horizontalLayout_4->addWidget(label);
将您的 UI 修改放在主窗口的插槽中,并将线程信号连接到该插槽,它可能会起作用。我认为只有主线程可以访问 Qt 中的 UI。因此,如果您想要 GUI 功能,它必须在那里,并且只能从其他线程发出信号。
好的,这是一个简单的例子。顺便说一句,你的场景并不需要扩展QThread
——所以你最好不要这样做,除非你真的必须这样做。这就是为什么在这个例子中我将使用一个普通QThread
的带有QObject
基础工作者的方法,但是如果你子类化,这个概念是一样的QThread
:
主界面:
class MainUI : public QWidget
{
Q_OBJECT
public:
explicit MainUI(QWidget *parent = 0): QWidget(parent) {
layout = new QHBoxLayout(this);
setLayout(layout);
QThread *thread = new QThread(this);
GUIUpdater *updater = new GUIUpdater();
updater->moveToThread(thread);
connect(updater, SIGNAL(requestNewLabel(QString)), this, SLOT(createLabel(QString)));
connect(thread, SIGNAL(destroyed()), updater, SLOT(deleteLater()));
updater->newLabel("h:/test.png");
}
public slots:
void createLabel(const QString &imgSource) {
QPixmap i1(imgSource);
QLabel *label = new QLabel(this);
label->setPixmap(i1);
layout->addWidget(label);
}
private:
QHBoxLayout *layout;
};
...和工人对象:
class GUIUpdater : public QObject {
Q_OBJECT
public:
explicit GUIUpdater(QObject *parent = 0) : QObject(parent) {}
void newLabel(const QString &image) { emit requestNewLabel(image); }
signals:
void requestNewLabel(const QString &);
};
工作对象被创建并移动到另一个线程,然后连接到创建标签的插槽,然后newLabel
调用它的方法,这只是一个包装器,用于发出requestNewLabel
信号并将路径传递给图像。然后,信号与图像路径参数一起从工作对象/线程传递到主 UI 插槽,并将新标签添加到布局中。
由于工作对象是在没有父对象的情况下创建的,以便能够将其移动到另一个线程,因此我们还将线程销毁信号连接到工作deleteLater()
槽。