一槽多信号

2023-12-19

对于我的 GUI,我希望有两对按钮可以在滚动区域中上下滚动。第一组按钮应该在滚动区域 1 上工作,第二组按钮应该在滚动区域 2 上工作。我放在滚动区域中的小部件称为 viewport1 和 viewport2。 由于两组按钮都应该执行相同的操作(向上和向下滚动),我想我会创建两个名为scrollUp和scrollDown的插槽来处理两组按钮的滚动。不幸的是我无法完成这项工作并且需要一些帮助。我已经尝试过以下方法:

QPushButton up;
QPushButton down;
QPushButton up2;
QPushButton down2;

connect(&up,SIGNAL(clicked()),&up,SLOT(scrollUp()));
connect(&up2,SIGNAL(clicked()),&up,SLOT(scrollUp()));
connect(&down,SIGNAL(clicked()),&down,SLOT(scrollDown()));
connect(&down2,SIGNAL(clicked()),&down,SLOT(scrollDown()));

void MainWindow::scrollDown()
{
QScrollArea area;
QWidget view;

if((QPushButton) &sender = down)
{
    area=scrollArea;
    view=viewport;
}
if((QPushButton) &sender = down2)
{
    area=scrollArea;
    view=viewport;
}
int curpos = area.verticalScrollBar()->value();
area.verticalScrollBar()->setValue(curpos+15);
int newpos = area.verticalScrollBar()->value();
QPoint topLeft = area.viewport()->rect().topLeft();
view.move(topLeft.x(),topLeft.y()-(newpos));
}

void MainWindow::scrollUp()
{
QScrollArea area;
QWidget view;

if((QPushButton) &sender = up)
{
    area=scrollArea;
    view=viewport;
}
if((QPushButton) &sender = up2)
{
    area=scrollArea2;
    view=viewport2;
}
int curpos = area.verticalScrollBar()->value();
area.verticalScrollBar()->setValue(curpos-15);
int newpos = area.verticalScrollBar()->value();
QPoint topLeft = area.viewport()->rect().topLeft();
view.move(topLeft.x(),topLeft.y()-(newpos));
}

但由于多种原因,这不起作用。我还尝试给插槽一些参数,例如:

connect(&up,SIGNAL(clicked()),&up,SLOT(scrollUp(scrollarea1,viewport1)));
connect(&up2,SIGNAL(clicked()),&up,SLOT(scrollUp(scrollarea2,viewport2)));

但再次没有成功。有谁能够帮助我?


首先,“它不起作用”并不意味着什么,如果你不说出你遇到了什么错误,就很难帮助你。那么,问题就很少了。

所有QObject派生类都是不可复制的,这意味着你不能这样做

QWidget a;
QWidget b;
b = a; // Wrong

您应该使用指针(或者也许是引用)。

QWidget a;
QWidget * b = new QWidget(...);
QWidget * c;
c = & a; // Ok
c = b; // Ok

那么你的connect调用错误:

connect(&up, SIGNAL(clicked()), &up, SLOT(scrollUp()));

第三个参数是拥有槽的对象。up是一个 QPushButton,它没有scrollUp()插槽,是您的主窗口执行以下操作:

connect(&up, SIGNAL(clicked()), this, SLOT(scrollUp()));

(since connect在 MainWindow 的构造函数中调用this指向当前的 MainWindow 对象)。

同样在 C++ 中=符号表示赋值,用于相等比较使用=='. Andsender` 是一个函数。

如果以正确的方式实施,您的方法应该有效:

class MainWindow: public QWidget
{
    QScrollArea * scroll1;
    QScrollArea * scroll2;
    QWidget * view1;
    QWidget * view2;
    QPushButton * up1;
    QPushButton * up2;
    QPushButton * down1;
    QPushButton * down2;

public:
    MainWindow()
    {
        // Here initialize member variables.
        ...

        connect(up1, SIGNAL(clicked()), this, SLOT(scrollUp()));
        connect(up2, SIGNAL(clicked()), this, SLOT(scrollUp()));
        connect(down1, SIGNAL(clicked()), this, SLOT(scrollDown()));
        connect(down2, SIGNAL(clicked()), this, SLOT(scrollDown()));
    }

public slots:
    void scrollDown()
    {
        QScrollArea * area;
        QWidget * view;

        if(qobject_cast<QPushButton>(sender()) == down1) {
            area = & scroll1;
            view = & view1;
        } else if(qobject_cast<QPushButton>(sender()) == down2) {
            area = & scroll2;
            view = & view2;
        } else {
            // Error.
        }

        // Now `area` and `view` point to the right widgets.
        ...
    }

    void scrollUp()
    {
        // The same as before.
    }
};

另一种方法是将实际的滚动指令提取到单独的函数中:

class MainWindow: public QWidget
{
    // Same variables as before
    ...

public:
    MainWindow()
    {
        // Here initialize member variables.
        ...

        connect(up1, SIGNAL(clicked()), this, SLOT(scrollUp1()));
        connect(up2, SIGNAL(clicked()), this, SLOT(scrollUp2()));
        connect(down1, SIGNAL(clicked()), this, SLOT(scrollDown1()));
        connect(down2, SIGNAL(clicked()), this, SLOT(scrollDown2()));
    }

public slots:
    void scrollDown(QScrollArea * area, QWidget * view)
    {
        // Here you scroll over `area` and `view`.
    }

    void scrollDown1()
    {
        scrollDown(scroll1, area1);
    }

    void scrollDown2()
    {
        scrollDown(scroll2, area2);
    }

    // Again, the same for `scrollUp`.
};
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

一槽多信号 的相关文章

  • Qt + win32 + mingw 上的原生 Windows API 链接问题

    我正在尝试使用 mingw 工具集将本机 Windows API 与 Qt 结合使用 部分功能存在链接问题 会发生什么 这是 mingw 名称修改的错误吗 ifdef Q WS WIN HWND hwnd QWidget winId HDC
  • 对齐坐标系

    Let s say I have 2 coordinate systems as it is shown in image attached 如何对齐这个坐标系 我知道我需要将第二个坐标系围绕 X 平移 180 度 然后将其平移到第一个坐标
  • cx_freeze:QODBC 驱动程序未加载

    我的 python 应用程序如下所示 test py from PyQt4 import QtCore from PyQt4 import QtGui from PyQt4 import QtSql import sys import at
  • Windows 消息循环而不是 QApplication::exec() / QApplication::processEvents()

    我是否想念任何一个Qt如果我替换功能QApplication exec 使用标准 Windows 消息循环实现 这应该可以澄清我的意思 运行事件处理的常用 Qt 方式 int main int argc char argv QApplica
  • 如何将图标放置到 QLineEdit 上?

    stackoverflow com 网站的右上角有一个带有放大镜头的搜索字段和一个灰色的 搜索 关键字 我想知道是否有可能实现相同的外观QLineEdit 如果是这样那怎么办 QLineEdit lineEdit new QLineEdit
  • MAC 上的 QT/C++ - 未设置应用程序图标

    我正在努力解决的奇怪问题 在与我的 pro QT 项目文件相同的文件夹中 我有一个 Resources myIcon png 我试图将其设置为我构建的应用程序的图标 在 OSX 上运行 我阅读了文档 它建议在 pro 文件中添加 ICON
  • QGraphicsView 和 eventFilter

    这个问题已经困扰我两天多了 所以我想我应该问一下 我在Win7上使用Qt 4 5 3 用VC2008编译 我有 MyGraphicsView 继承 QGraphicsView 和 MyFilter 继承 QObject 类 当我将 MyFi
  • 如何在 Qt-Embedded 中(正确)输出多语言文本?

    我的目标系统是 linux 3 3 7 Qt Embedded 开源版 4 8 Droid 字体 取自 fonts droid 20111207 git 1 all deb Debian 软件包并复制到 usr lib fonts目录 主要
  • 程序意外完成 - QT Creator

    我正在尝试使用 QT Creator 使用 QT 框架开发 GUI 控制台应用程序 我使用的是Windows XP 我安装了QT 4 8 3和mingw 两者均已安装 没有任何错误 然后我安装了QT Creator QT 版本 路径中的 Q
  • 当我尝试构建 Qt 4.7.1 静态库时,“找不到 -ljscore”

    我尝试从最新的源构建静态 Qt 库 但出现以下错误 usr bin ld cannot find ljscore collect2 ld returned 1 exit status 如何解决这个问题呢 这是 Qt 构建系统中自 4 7 0
  • QDesktopServices::openUrl 在资源管理器中选择指定文件

    在大多数编码程序中 您可以右键单击该项目 然后单击 在资源管理器中显示 它会在资源管理器中显示选定项目的文件 在 Qt 中使用 QDesktopServices 如何做到这一点 或在 QT 中执行此操作的任何方式 您可以使用此方法在 Win
  • (如何)我可以抑制未找到包配置文件的警告吗?

    我正在尝试创建一个CMakeLists txt尝试查找的文件Qt5 如果失败 则尝试回退到Qt4安装 该脚本到目前为止有效 但如果出现以下情况我总会收到警告Qt5未安装 注意FindQt5 cmake是由提供Qt5并且仅当以下情况时才可用Q
  • Qt mouseReleaseEvent() 未触发?

    我有一个显示图片的库 我们称之为 PictureGLWidget 其中 class PictureGLWidget public QGLWidget 所以 PictureGLWidget 扩展了 QGLWidget 在PictureGlWi
  • 如何防止灯具与 django post_save 信号代码冲突?

    在我的应用程序中 我想在新用户注册时在某些表中创建条目 例如 我想创建一个用户配置文件 然后该配置文件将引用他们的公司和他们的一些其他记录 我用 post save 信号实现了这一点 def callback create profile
  • PyQt:如何设置组合框项目可检查?

    为了将 GUI 小部件数量保持在最低限度 我需要找到一种方法来为用户提供下拉菜单项的选择 这些菜单项可用于过滤掉 listWidget 项中显示的内容 假设 listWidget 列出了 5 个不同类别的项目 Cat A Cat B Cat
  • 在 Qt5 中,是否需要 Q_INVOKABLE 来从 QML 调用公共 QObject 函数?

    我刚刚意识到我可以调用暴露于 QML 的对象的几乎任何函数 现在我对 Q INVOKABLE 很好奇 Qt5docs http doc qt io qt 5 qtqml cppintegration exposecppattributes
  • Qt 文件对话框默认后缀不起作用

    我将以下代码用于 QtQuick Dialogs 1 3 和 Qt 5 10 0 下 filedialog 的新属性 我使用 Qt Creator 5 10 默认套件构建它 import QtQuick 2 10 import QtQuic
  • QToolButton:更改菜单位置

    使用菜单时QToolButton菜单显示在按钮的正下方 有没有办法在按钮的左侧 右侧显示菜单 我知道这个问题不久前已得到回答 但我想为此问题添加新答案 因为接受的答案不再有效 实际上 更改 QToolButton 上的菜单位置非常容易 您需
  • 使用 QtWebEngine 将 C++ 对象暴露给 Qt 中的 Javascript

    使用 QtWebkit 可以通过以下方式将 C 对象公开给 JavascriptQWebFrame addToJavaScriptWindowObject如中所述https stackoverflow com a 20685002 5959
  • Qt 布局,在小部件大小更改后调整到最小大小

    基本上我有一个QGridLayout里面有一些小部件 最重要的是 2 个标签 我用它们将图像绘制到屏幕上 好吧 如果用户愿意 他可以更改传入图像的分辨率 从而强制标签调整大小 我们假设标签的初始大小是320x240 用户将 VideoMod

随机推荐

  • 如何在 Django 中测试空查询集?

    我正在 Django 中测试一个视图 该视图应该从对象中删除所有标签 为此 我使用这个断言 self assertEqual list Tag objects get for object Animal objects get pk 1 这
  • 根据 Airflow 中任务的输出字典动态生成多个任务

    我有一个任务 其中输出是一个字典 每个键中都有一个列表值 task task id gen dict def generate dict return output dict output look like this A aa bb cc
  • ASP.NET Web API,从 Flex FileReference 上传时 MIME 多部分流意外结束

    按照 ASP NET 上的教程 实现了一个用于执行异步文件上传的 Web API 控制器方法 如下所示 public Task
  • 帮助理解 Java 中的函数对象或函子

    有人可以解释什么是函子并提供一个简单的例子吗 函数对象就是这样 既是对象又是函数的东西 旁白 将函数对象称为 函子 是对该术语的严重滥用 另一种 函子 是数学中的核心概念 并且在计算机科学中具有直接作用 请参阅 Haskell 函子 该术语
  • 在 PHP 中应用差异

    我正在使用 Text Diff PEAR 包来比较短文本文档 其中 Text Diff 对象是使用每个文档中以空格分隔的单词列表创建的 我希望将差异存储在数据库中 然后在再次加载文件时应用它 有没有一种简单的方法来应用这个差异 或者我需要编
  • 应用程序根目录中“npm install”生成的许多不必要的文件

    通常 当我在应用程序目录中执行 npm install 时 会在 node modules 文件夹中生成一堆 npm 库文件 这是预期的 今天突然我开始看到许多文件在应用程序目录内部和节点模块外部生成 有人遇到过这个问题吗 如果是的话 有什
  • C++ int 操作在 mips 架构上是原子的吗

    我想知道我是否可以在不锁定 mips cpu 的情况下读取或写入共享 int 值 尤其是 Amazon 或 Danube 我的意思是 如果这样的读取或写入是原子的 其他线程不能中断它们 需要明确的是 我不想阻止线程之间的竞争 但我关心 in
  • 在 Windows 中的 Windows 移动应用程序中发送邮件

    我是 Windows Mobile 应用程序的新手 在我的项目中 我想使用发送电子邮件microsoft windowsmobile pocketoutlook 到目前为止我有以下代码 private void btnsubmit Clic
  • 为什么 Rust 允许通过空指针调用函数?

    我正在尝试 Rust 中的函数指针魔法 最终得到了一个代码片段 我完全没有解释为什么它会编译 甚至没有解释它为什么运行 fn foo println This is really weird fn caller
  • 如何将文件夹层次结构中的所有 git 内容向上移动一级?

    我有一个 git 存储库 其结构如下 repo git bootstrap py buildout cfg gitignore webapp manage py modules templates static 我想移动内容webapp文件
  • Net Core:从 Autofac 模块访问 appsettings.json 值

    AspNet核心应用程序 1 像这样的Autofac模块 public class AutofacModule Module protected override void Load ContainerBuilder builder Reg
  • 在 PHP PCRE 函数中双重转义还是不双重转义?

    我一直在寻找一篇关于何时需要双重转义 何时不需要双重转义的可靠文章 但我找不到任何东西 也许我看起来不够仔细 因为我确信在某个地方有一个解释 但让下一个有这个问题的人很容易找到 以以下正则表达式模式为例 n domain com myfee
  • 封闭式班级

    是否可以创建一个不再接纳新成员的类型类 也许通过使用模块边界 我可以拒绝导出完整实例定义所需的函数 但这只会在有人生成无效实例时导致运行时错误 我可以将其设置为编译时错误吗 自 GHC 7 8 1 起 封闭型家庭 https downloa
  • 单击超链接时停止模糊事件

    我用了这个答案jQuery 模拟输入和 div https stackoverflow com questions 11228628 jquery select simulation with input and div创建一个看起来相似的
  • 拖放背后的逻辑

    我想知道基本拖放功能的 它是如何工作的 和 它应该如何设计和实现 方面 我还没有实现过这样的功能 我正计划为我的一个项目这样做 并且我确实对如何实施它有一些想法 我想确保我走在正确的道路上 并且你们很可能也对此事有话要说 假设我有如下列出的
  • 如何在存储库上使用 svn2git

    我在用着svn2git https github com nirvdrum svn2git测试 svn 存储库到 git 的迁移 现在我的 svn 是这样构建的 myproj包含 repo1 repo2 obsolete old 每个存储库
  • Razor/JavaScript 和尾随分号

    使用 Visual Studio 2012 在 Razor 视图页面的 JavaScript 部分中 我发现 Razor 语法与 JavaScript 语法之间存在战斗 特别是 脚本部分中的尾部分号由智能感知标记 并传递编译器警告 而不是错
  • HDFS中的数据块大小,为什么是64MB?

    HDFS Hadoop默认数据块大小为64MB 磁盘中的块大小一般为4KB 64MB 块大小意味着什么 gt 是否意味着从磁盘读取的最小单位是64MB 如果是 这样做的好处是什么 gt 方便连续访问 HDFS 中的大文件 我们可以使用磁盘原
  • Angular2可观察http获取条件重复

    我正在使用 angular2 可观察模式来发出 http 请求 我正在尝试有条件地重复 http get 我想执行 http get 直到满足条件 http get url map res gt if the condition is me
  • 一槽多信号

    对于我的 GUI 我希望有两对按钮可以在滚动区域中上下滚动 第一组按钮应该在滚动区域 1 上工作 第二组按钮应该在滚动区域 2 上工作 我放在滚动区域中的小部件称为 viewport1 和 viewport2 由于两组按钮都应该执行相同的操