qt 同一个页面 在不同的窗口加载数据不一样
时间: 2023-12-04 14:06:22 浏览: 73
如果您的Qt程序在同一个页面中加载数据,但在不同的窗口中数据不一样,可能是因为您在窗口之间共享数据的方式不正确。一个解决方法是将数据存储在单独的数据模型中,然后在窗口之间共享该数据模型。您可以使用Qt的信号和槽机制来更新数据模型并在窗口之间传递信号。另一个解决方法是在每个窗口中加载数据时,确保您使用的是正确的数据源。您可以使用Qt的属性系统在窗口中存储数据源,并在每个窗口加载数据时使用正确的数据源。
相关问题
Qt 已知 将视频播放到窗口C 中时,且一定不可以将半透明窗口D设置为C的子窗口。窗口C 才可正常播放。如果想要 一个无论如何移动或者改变大小C窗口,半透明窗口D都可以悬浮于窗口C,当C被其他窗口遮挡时,D也不会展现。即就好像D是C的子窗口一样,Qt Cpp 源码如何实现?
实现这个功能,可以使用Qt的Graphics View Framework。具体步骤如下:
1. 创建一个QGraphicsView对象作为窗口C,设置其背景为黑色(或者其他颜色),并将其设置为透明。
2. 创建一个QGraphicsScene对象,并将其设置为QGraphicsView的场景。
3. 在场景中添加一个QGraphicsPixmapItem对象,用于显示视频。
4. 创建一个QWidget对象作为窗口D,设置其背景为半透明的白色(或者其他颜色),并将其设置为透明。
5. 将QWidget对象添加到场景中,并设置其Z值,使其位于QGraphicsPixmapItem之上。
6. 在QGraphicsView中重写mousePressEvent、mouseMoveEvent和mouseReleaseEvent三个事件函数,实现窗口C的拖拽和缩放功能。
7. 在QGraphicsPixmapItem中重写boundingRect函数,返回其在场景中的边界矩形,从而使得窗口D可以自动跟随QGraphicsPixmapItem的位置和大小变化。
8. 在QWidget中重写paintEvent函数,绘制窗口D的内容。
下面是示例代码:(假设视频文件为test.mp4)
```
#include <QtWidgets>
#include <QtMultimedia>
class VideoPlayer : public QGraphicsView {
public:
VideoPlayer(QWidget *parent = nullptr) : QGraphicsView(parent) {
setStyleSheet("background-color: black"); // 设置背景为黑色
setWindowFlags(Qt::FramelessWindowHint); // 去掉边框
setAttribute(Qt::WA_TranslucentBackground); // 设置为透明
setDragMode(QGraphicsView::ScrollHandDrag); // 设置拖拽模式
setRenderHint(QPainter::Antialiasing); // 抗锯齿
QGraphicsScene *scene = new QGraphicsScene(this);
QGraphicsPixmapItem *item = new QGraphicsPixmapItem();
item->setPixmap(QPixmap(":/test.mp4")); // 加载视频
scene->addItem(item);
setScene(scene);
QWidget *widget = new QWidget();
widget->setStyleSheet("background-color: rgba(255, 255, 255, 128)"); // 设置半透明白色背景
widget->setAttribute(Qt::WA_TranslucentBackground); // 设置为透明
widget->setFixedSize(200, 100); // 设置固定大小
widget->move(10, 10); // 设置初始位置
widget->installEventFilter(this); // 安装事件过滤器
scene->addWidget(widget);
widget->raise(); // 将窗口D置于顶层
}
protected:
void mousePressEvent(QMouseEvent *event) override {
if (event->button() == Qt::LeftButton) {
m_lastPos = event->pos();
setCursor(Qt::ClosedHandCursor);
}
}
void mouseMoveEvent(QMouseEvent *event) override {
if (event->buttons() & Qt::LeftButton) {
QPoint delta = event->pos() - m_lastPos;
translate(delta.x(), delta.y());
m_lastPos = event->pos();
}
}
void mouseReleaseEvent(QMouseEvent *event) override {
if (event->button() == Qt::LeftButton) {
setCursor(Qt::ArrowCursor);
}
}
QRectF boundingRect() const override {
return sceneRect();
}
bool eventFilter(QObject *obj, QEvent *event) override {
if (event->type() == QEvent::Paint) {
QPainter painter((QWidget*) obj);
painter.setRenderHint(QPainter::Antialiasing);
painter.setPen(Qt::NoPen);
painter.setBrush(QBrush(QColor(255, 0, 0, 128))); // 绘制红色半透明矩形
painter.drawRect(10, 10, 180, 80);
return true;
}
return QGraphicsView::eventFilter(obj, event);
}
private:
QPoint m_lastPos;
};
int main(int argc, char *argv[]) {
QApplication app(argc, argv);
VideoPlayer player;
player.resize(640, 480);
player.show();
return app.exec();
}
```
qt菜单栏与界面背景一样不使用qss文件
可以通过在Qt Designer中编辑界面来实现。您可以选择一个QMainWindow对象,在QObject Inspector窗口中,在其子对象列表中找到QMenuBar对象。您可以将其拖放到您的主窗口中,然后将菜单项添加到菜单栏中。您还可以在属性编辑器窗口中更改其样式和其他属性,例如背景颜色。
阅读全文